Polish reference manual

This commit is contained in:
Sam Brannen 2015-07-30 21:31:40 +02:00
parent 8bc2bffa77
commit c91c93c816
5 changed files with 164 additions and 79 deletions

View File

@ -30,7 +30,7 @@ For the currently recommended usage patterns for Hibernate see <<orm-hibernate>>
[[orm-hibernate-template]]
===== the HibernateTemplate
===== The HibernateTemplate
The basic programming model for templating looks as follows, for methods that can be
part of any custom data access object or business service. There are no restrictions on

View File

@ -82,6 +82,7 @@ image::images/container-magic.png[width=250]
[[beans-factory-metadata]]
=== Configuration metadata
As the preceding diagram shows, the Spring IoC container consumes a form of
__configuration metadata__; this configuration metadata represents how you as an
application developer tell the Spring container to instantiate, configure, and assemble
@ -158,6 +159,7 @@ referring to collaborating objects is not shown in this example; see
[[beans-factory-instantiation]]
=== Instantiating a container
Instantiating a Spring IoC container is straightforward. The location path or paths
supplied to an `ApplicationContext` constructor are actually resource strings that allow
the container to load configuration metadata from a variety of external resources such
@ -239,6 +241,7 @@ collaborating objects. For details of configuring an object's dependencies, see
[[beans-factory-xml-import]]
==== Composing XML-based configuration metadata
It can be useful to have bean definitions span multiple XML files. Often each individual
XML configuration file represents a logical layer or module in your architecture.
@ -291,6 +294,7 @@ system properties at runtime.
[[beans-factory-client]]
=== Using the container
The `ApplicationContext` is the interface for an advanced factory capable of maintaining
a registry of different beans and their dependencies. Using the method `T getBean(String
name, Class<T> requiredType)` you can retrieve instances of your beans.
@ -398,6 +402,7 @@ lead to concurrent access exceptions and/or inconsistent state in the bean conta
[[beans-beanname]]
=== Naming beans
Every bean has one or more identifiers. These identifiers must be unique within the
container that hosts the bean. A bean usually has only one identifier, but if it
requires more than one, the extra ones can be considered aliases.
@ -435,6 +440,7 @@ by name.
[[beans-beanname-alias]]
==== Aliasing a bean outside the bean definition
In a bean definition itself, you can supply more than one name for the bean, by using a
combination of up to one name specified by the `id` attribute, and any number of other
names in the `name` attribute. These names can be equivalent aliases to the same bean,
@ -483,6 +489,7 @@ see <<beans-java-bean-annotation>> for details.
[[beans-factory-class]]
=== Instantiating beans
A bean definition essentially is a recipe for creating one or more objects. The
container looks at the recipe for a named bean when asked, and uses the configuration
metadata encapsulated by that bean definition to create (or acquire) an actual object.
@ -521,6 +528,7 @@ the outer class name.
[[beans-factory-class-ctor]]
==== Instantiation with a constructor
When you create a bean by the constructor approach, all normal classes are usable by and
compatible with Spring. That is, the class being developed does not need to implement
any specific interfaces or to be coded in a specific fashion. Simply specifying the bean
@ -552,6 +560,7 @@ and setting object instance properties after the object is constructed, see
[[beans-factory-class-static-factory-method]]
==== Instantiation with a static factory method
When defining a bean that you create with a static factory method, you use the `class`
attribute to specify the class containing the `static` factory method and an attribute
named `factory-method` to specify the name of the factory method itself. You should be
@ -592,6 +601,7 @@ see <<beans-factory-properties-detailed,Dependencies and configuration in detail
[[beans-factory-class-instance-factory-method]]
==== Instantiation using an instance factory method
Similar to instantiation through a <<beans-factory-class-static-factory-method,static
factory method>>, instantiation with an instance factory method invokes a non-static
method of an existing bean from the container to create a new bean. To use this
@ -695,7 +705,8 @@ application where objects collaborate to achieve a goal.
[[beans-factory-collaborators]]
=== Dependency injection
=== Dependency Injection
__Dependency injection__ (DI) is a process whereby objects define their dependencies,
that is, the other objects they work with, only through constructor arguments, arguments
to a factory method, or properties that are set on the object instance after it is
@ -717,6 +728,7 @@ dependency injection>> and <<beans-setter-injection,Setter-based dependency inje
[[beans-constructor-injection]]
==== Constructor-based dependency injection
__Constructor-based__ DI is accomplished by the container invoking a constructor with a
number of arguments, each representing a dependency. Calling a `static` factory method
with specific arguments to construct the bean is nearly equivalent, and this discussion
@ -745,6 +757,7 @@ has no dependencies on container specific interfaces, base classes or annotation
[[beans-factory-ctor-arguments-resolution]]
===== Constructor argument resolution
Constructor argument resolution matching occurs using the argument's type. If no
potential ambiguity exists in the constructor arguments of a bean definition, then the
order in which the constructor arguments are defined in a bean definition is the order
@ -888,6 +901,7 @@ then have to look as follows:
[[beans-setter-injection]]
==== Setter-based dependency injection
__Setter-based__ DI is accomplished by the container calling setter methods on your
beans after invoking a no-argument constructor or no-argument `static` factory method to
instantiate your bean.
@ -955,6 +969,7 @@ injection may be the only available form of DI.
[[beans-dependency-resolution]]
==== Dependency resolution process
The container performs bean dependency resolution as follows:
* The `ApplicationContext` is created and initialized with configuration metadata that
@ -1027,6 +1042,7 @@ are invoked.
[[beans-some-examples]]
==== Examples of dependency injection
The following example uses XML-based configuration metadata for setter-based DI. A small
part of a Spring XML configuration file specifies some bean definitions:
@ -1168,6 +1184,7 @@ details will not be discussed here.
[[beans-factory-properties-detailed]]
=== Dependencies and configuration in detail
As mentioned in the previous section, you can define bean properties and constructor
arguments as references to other managed beans (collaborators), or as values defined
inline. Spring's XML-based configuration metadata supports sub-element types within its
@ -1300,6 +1317,7 @@ interceptor names prevents you from misspelling an interceptor id.
[[beans-ref-element]]
==== References to other beans (collaborators)
The `ref` element is the final element inside a `<constructor-arg/>` or `<property/>`
definition element. Here you set the value of the specified property of a bean to be a
reference to another bean (a collaborator) managed by the container. The referenced bean
@ -1361,6 +1379,7 @@ your existing `ref local` references to `ref bean` when upgrading to the 4.0 sch
[[beans-inner-beans]]
==== Inner beans
A `<bean/>` element inside the `<property/>` or `<constructor-arg/>` elements defines a
so-called __inner bean__.
@ -1386,6 +1405,7 @@ beans into collaborating beans other than into the enclosing bean.
[[beans-collection-elements]]
==== Collections
In the `<list/>`, `<set/>`, `<map/>`, and `<props/>` elements, you set the properties
and arguments of the Java `Collection` types `List`, `Set`, `Map`, and `Properties`,
respectively.
@ -1437,6 +1457,7 @@ following elements:__
[[beans-collection-elements-merging]]
===== Collection merging
The Spring container also supports the __merging__ of collections. An application
developer can define a parent-style `<list/>`, `<map/>`, `<set/>` or `<props/>` element,
and have child-style `<list/>`, `<map/>`, `<set/>` or `<props/>` elements inherit and
@ -1503,6 +1524,7 @@ uses internally.
[[beans-collection-merge-limitations]]
===== Limitations of collection merging
You cannot merge different collection types (such as a `Map` and a `List`), and if you
do attempt to do so an appropriate `Exception` is thrown. The `merge` attribute must be
specified on the lower, inherited, child definition; specifying the `merge` attribute on
@ -1510,6 +1532,7 @@ a parent collection definition is redundant and will not result in the desired m
[[beans-collection-elements-strongly-typed]]
===== Strongly-typed collection
With the introduction of generic types in Java 5, you can use strongly typed collections.
That is, it is possible to declare a `Collection` type such that it can only contain
`String` elements (for example). If you are using Spring to dependency-inject a
@ -1555,6 +1578,7 @@ various value elements as being of type `Float`, and the string values `9.99, 2.
[[beans-null-element]]
==== Null and empty string values
Spring treats empty arguments for properties and the like as empty `Strings`. The
following XML-based configuration metadata snippet sets the email property to the empty
`String` value ("").
@ -1598,6 +1622,7 @@ The above configuration is equivalent to the following Java code:
[[beans-p-namespace]]
==== XML shortcut with the p-namespace
The p-namespace enables you to use the `bean` element's attributes, instead of nested
`<property/>` elements, to describe your property values and/or collaborating beans.
@ -1680,6 +1705,7 @@ three approaches at the same time.
[[beans-c-namespace]]
==== XML shortcut with the c-namespace
Similar to the <<beans-p-namespace>>, the __c-namespace__, newly introduced in Spring
3.1, allows usage of inlined attributes for configuring the constructor arguments rather
then nested `constructor-arg` elements.
@ -1741,6 +1767,7 @@ through-out your configuration.
[[beans-compound-property-names]]
==== Compound property names
You can use compound or nested property names when you set bean properties, as long as
all components of the path except the final property name are not `null`. Consider the
following bean definition.
@ -1807,6 +1834,7 @@ itself being destroyed. Thus `depends-on` can also control shutdown order.
[[beans-factory-lazy-init]]
=== Lazy-initialized beans
By default, `ApplicationContext` implementations eagerly create and configure all
<<beans-factory-scopes-singleton,singleton>> beans as part of the initialization
process. Generally, this pre-instantiation is desirable, because errors in the
@ -1850,6 +1878,7 @@ You can also control lazy-initialization at the container level by using the
[[beans-factory-autowire]]
=== Autowiring collaborators
The Spring container can __autowire__ relationships between collaborating beans. You can
allow Spring to resolve collaborators (other beans) automatically for your bean by
inspecting the contents of the `ApplicationContext`. Autowiring has the following
@ -1913,6 +1942,7 @@ autowiring completes.
[[beans-autowired-exceptions]]
==== Limitations and disadvantages of autowiring
Autowiring works best when it is used consistently across a project. If autowiring is
not used in general, it might be confusing to developers to use it to wire only one or
two bean definitions.
@ -1948,6 +1978,7 @@ In the latter scenario, you have several options:
[[beans-factory-autowire-candidate]]
==== Excluding a bean from autowiring
On a per-bean basis, you can exclude a bean from autowiring. In Spring's XML format, set
the `autowire-candidate` attribute of the `<bean/>` element to `false`; the container
makes that specific bean definition unavailable to the autowiring infrastructure
@ -1968,8 +1999,10 @@ using autowiring. Rather, the bean itself is not a candidate for autowiring othe
[[beans-factory-method-injection]]
=== Method injection
In most application scenarios, most beans in the container are
<<beans-factory-scopes-singleton,singletons>>. When a singleton bean needs to
collaborate with another singleton bean, or a non-singleton bean needs to collaborate
@ -2033,6 +2066,7 @@ https://spring.io/blog/2004/08/06/method-injection/[this blog entry].
[[beans-factory-lookup-method-injection]]
==== Lookup method injection
Lookup method injection is the ability of the container to override methods on
__container managed beans__, to return the lookup result for another named bean in the
container. The lookup typically involves a prototype bean as in the scenario described
@ -2128,6 +2162,7 @@ these classes for additional information.
[[beans-factory-arbitrary-method-replacement]]
==== Arbitrary method replacement
A less useful form of method injection than lookup method injection is the ability to
replace arbitrary methods in a managed bean with another method implementation. Users
may safely skip the rest of this section until the functionality is actually needed.
@ -2272,6 +2307,7 @@ For instructions on how to register this or any other custom scope, see
[[beans-factory-scopes-singleton]]
=== The singleton scope
Only one __shared__ instance of a singleton bean is managed, and all requests for beans
with an id or ids matching that bean definition result in that one specific bean
instance being returned by the Spring container.
@ -2306,6 +2342,7 @@ in Spring__. To define a bean as a singleton in XML, you would write, for exampl
[[beans-factory-scopes-prototype]]
=== The prototype scope
The non-singleton, prototype scope of bean deployment results in the __creation of a new
bean instance__ every time a request for that specific bean is made. That is, the bean
is injected into another bean or you request it through a `getBean()` method call on the
@ -2347,6 +2384,7 @@ container, see <<beans-factory-lifecycle>>.)
[[beans-factory-scopes-sing-prot-interaction]]
=== Singleton beans with prototype-bean dependencies
When you use singleton-scoped beans with dependencies on prototype beans, be aware that
__dependencies are resolved at instantiation time__. Thus if you dependency-inject a
prototype-scoped bean into a singleton-scoped bean, a new prototype bean is instantiated
@ -2364,6 +2402,7 @@ runtime more than once, see <<beans-factory-method-injection>>
[[beans-factory-scopes-other]]
=== Request, session, and global session scopes
The `request`, `session`, and `global session` scopes are __only__ available if you use
a web-aware Spring `ApplicationContext` implementation (such as
`XmlWebApplicationContext`). If you use these scopes with regular Spring IoC containers
@ -2373,22 +2412,23 @@ complaining about an unknown bean scope.
[[beans-factory-scopes-other-web-configuration]]
==== Initial web configuration
To support the scoping of beans at the `request`, `session`, and `global session` levels
(web-scoped beans), some minor initial configuration is required before you define your
beans. (This initial setup is __not__ required for the standard scopes, singleton and
prototype.)
beans. (This initial setup is __not__ required for the standard scopes, `singleton` and
`prototype`.)
How you accomplish this initial setup depends on your particular Servlet environment..
How you accomplish this initial setup depends on your particular Servlet environment.
If you access scoped beans within Spring Web MVC, in effect, within a request that is
processed by the Spring `DispatcherServlet`, or `DispatcherPortlet`, then no special
processed by the Spring `DispatcherServlet` or `DispatcherPortlet`, then no special
setup is necessary: `DispatcherServlet` and `DispatcherPortlet` already expose all
relevant state.
If you use a Servlet 2.5 web container, with requests processed outside of Spring's
DispatcherServlet (for example, when using JSF or Struts), you need to register the
`DispatcherServlet` (for example, when using JSF or Struts), you need to register the
`org.springframework.web.context.request.RequestContextListener` `ServletRequestListener`.
For Servlet 3.0+, this can done programmatically via the `WebApplicationInitializer`
For Servlet 3.0+, this can be done programmatically via the `WebApplicationInitializer`
interface. Alternatively, or for older containers, add the following declaration to
your web application's `web.xml` file:
@ -2406,7 +2446,7 @@ your web application's `web.xml` file:
</web-app>
----
Alternatively, if there are issues with your listener setup, consider the provided
Alternatively, if there are issues with your listener setup, consider using Spring's
`RequestContextFilter`. The filter mapping depends on the surrounding web
application configuration, so you have to change it as appropriate.
@ -2427,7 +2467,7 @@ application configuration, so you have to change it as appropriate.
</web-app>
----
`DispatcherServlet`, `RequestContextListener` and `RequestContextFilter` all do exactly
`DispatcherServlet`, `RequestContextListener`, and `RequestContextFilter` all do exactly
the same thing, namely bind the HTTP request object to the `Thread` that is servicing
that request. This makes beans that are request- and session-scoped available further
down the call chain.
@ -2435,6 +2475,7 @@ down the call chain.
[[beans-factory-scopes-request]]
==== Request scope
Consider the following bean definition:
[source,xml,indent=0]
@ -2454,6 +2495,7 @@ bean that is scoped to the request is discarded.
[[beans-factory-scopes-session]]
==== Session scope
Consider the following bean definition:
[source,xml,indent=0]
@ -2475,6 +2517,7 @@ HTTP `Session` is eventually discarded, the bean that is scoped to that particul
[[beans-factory-scopes-global-session]]
==== Global session scope
Consider the following bean definition:
[source,xml,indent=0]
@ -2497,6 +2540,7 @@ error is raised.
[[beans-factory-scopes-application]]
==== Application scope
Consider the following bean definition:
[source,xml,indent=0]
@ -2516,6 +2560,7 @@ and it is actually exposed and therefore visible as a `ServletContext` attribute
[[beans-factory-scopes-other-injection]]
==== Scoped beans as dependencies
The Spring IoC container manages not only the instantiation of your objects (beans), but
also the wiring up of collaborators (or dependencies). If you want to inject (for
example) an HTTP request scoped bean into another bean, you must inject an AOP proxy in
@ -2616,6 +2661,7 @@ Thus you need the following, correct and complete, configuration when injecting
[[beans-factory-scopes-other-injection-proxies]]
===== Choosing the type of proxy to create
By default, when the Spring container creates a proxy for a bean that is marked up with
the `<aop:scoped-proxy/>` element, __a CGLIB-based class proxy is created__.
@ -2653,6 +2699,7 @@ see <<aop-proxying>>.
[[beans-factory-scopes-custom]]
=== Custom scopes
The bean scoping mechanism is extensible; You can define your own
scopes, or even redefine existing scopes, although the latter is considered bad practice
and you __cannot__ override the built-in `singleton` and `prototype` scopes.
@ -2660,6 +2707,7 @@ and you __cannot__ override the built-in `singleton` and `prototype` scopes.
[[beans-factory-scopes-custom-creating]]
==== Creating a custom scope
To integrate your custom scope(s) into the Spring container, you need to implement the
`org.springframework.beans.factory.config.Scope` interface, which is described in this
section. For an idea of how to implement your own scopes, see the `Scope`
@ -2715,6 +2763,7 @@ identifier can be the session identifier.
[[beans-factory-scopes-custom-using]]
==== Using a custom scope
After you write and test one or more custom `Scope` implementations, you need to make
the Spring container aware of your new scope(s). The following method is the central
method to register a new `Scope` with the Spring container:
@ -2812,6 +2861,7 @@ bean itself that is scoped, not the object returned from `getObject()`.
[[beans-factory-lifecycle]]
=== Lifecycle callbacks
To interact with the container's management of the bean lifecycle, you can implement the
Spring `InitializingBean` and `DisposableBean` interfaces. The container calls
`afterPropertiesSet()` for the former and `destroy()` for the latter to allow the bean
@ -2844,6 +2894,7 @@ The lifecycle callback interfaces are described in this section.
[[beans-factory-lifecycle-initializingbean]]
==== Initialization callbacks
The `org.springframework.beans.factory.InitializingBean` interface allows a bean to
perform initialization work after all necessary properties on the bean have been set by
the container. The `InitializingBean` interface specifies a single method:
@ -2905,6 +2956,7 @@ but does not couple the code to Spring.
[[beans-factory-lifecycle-disposablebean]]
==== Destruction callbacks
Implementing the `org.springframework.beans.factory.DisposableBean` interface allows a
bean to get a callback when the container containing it is destroyed. The
`DisposableBean` interface specifies a single method:
@ -2977,6 +3029,7 @@ default behavior with Java config.
[[beans-factory-lifecycle-default-init-destroy-methods]]
==== Default initialization and destroy methods
When you write initialization and destroy method callbacks that do not use the
Spring-specific `InitializingBean` and `DisposableBean` callback interfaces, you
typically write methods with names such as `init()`, `initialize()`, `dispose()`, and so
@ -3056,6 +3109,7 @@ interacts directly to the raw target bean.
[[beans-factory-lifecycle-combined-effects]]
==== Combining lifecycle mechanisms
As of Spring 2.5, you have three options for controlling bean lifecycle behavior: the
<<beans-factory-lifecycle-initializingbean, `InitializingBean`>> and
<<beans-factory-lifecycle-disposablebean, `DisposableBean`>> callback interfaces; custom
@ -3088,6 +3142,7 @@ Destroy methods are called in the same order:
[[beans-factory-lifecycle-processor]]
==== Startup and shutdown callbacks
The `Lifecycle` interface defines the essential methods for any object that has its own
lifecycle requirements (e.g. starts and stops some background process):
@ -3215,6 +3270,7 @@ above.
[[beans-factory-shutdown]]
==== Shutting down the Spring IoC container gracefully in non-web applications
[NOTE]
====
This section applies only to non-web applications. Spring's web-based
@ -4292,6 +4348,7 @@ any). These types must be 'wired up' explicitly via XML or using a Spring `@Bean
[[beans-autowired-annotation-primary]]
=== Fine-tuning annotation-based autowiring with @Primary
Because autowiring by type may lead to multiple candidates, it is often necessary to have
more control over the selection process. One way to accomplish this is with Spring's
`@Primary` annotation. `@Primary` indicates that a particular bean should be given
@ -4369,6 +4426,7 @@ The corresponding bean definitions appear as follows.
[[beans-autowired-annotation-qualifiers]]
=== Fine-tuning annotation-based autowiring with qualifiers
`@Primary` is an effective way to use autowiring by type with several instances when one
primary candidate can be determined. When more control over the selection process is
required, Spring's `@Qualifier` annotation can be used. You can associate qualifier values
@ -4722,6 +4780,7 @@ the following example.
[[beans-generics-as-qualifiers]]
=== Using generics as autowiring qualifiers
In addition to the `@Qualifier` annotation, it is also possible to use Java generic types
as an implicit form of qualification. For example, suppose you have the following
configuration:
@ -4939,18 +4998,18 @@ For details about the effects of combining various lifecycle mechanisms, see
[[beans-classpath-scanning]]
== Classpath scanning and managed components
Most examples in this chapter use XML to specify the configuration metadata that
produces each `BeanDefinition` within the Spring container. The previous section
Most examples in this chapter use XML to specify the configuration metadata that produces
each `BeanDefinition` within the Spring container. The previous section
(<<beans-annotation-config>>) demonstrates how to provide a lot of the configuration
metadata through source-level annotations. Even in those examples, however, the "base"
bean definitions are explicitly defined in the XML file, while the annotations only
drive the dependency injection. This section describes an option for implicitly
detecting the __candidate components__ by scanning the classpath. Candidate components
are classes that match against a filter criteria and have a corresponding bean
definition registered with the container. This removes the need to use XML to perform
bean registration, instead you can use annotations (for example @Component), AspectJ
type expressions, or your own custom filter criteria to select which classes will have
bean definitions registered with the container.
bean definitions are explicitly defined in the XML file, while the annotations only drive
the dependency injection. This section describes an option for implicitly detecting the
__candidate components__ by scanning the classpath. Candidate components are classes that
match against a filter criteria and have a corresponding bean definition registered with
the container. This removes the need to use XML to perform bean registration; instead you
can use annotations (for example `@Component`), AspectJ type expressions, or your own
custom filter criteria to select which classes will have bean definitions registered with
the container.
[NOTE]
====
@ -4966,7 +5025,7 @@ than using the traditional XML files. Take a look at the `@Configuration`, `@Bea
=== @Component and further stereotype annotations
The `@Repository` annotation is a marker for any class that fulfills the role or
__stereotype__ (also known as Data Access Object or DAO) of a repository. Among the uses
__stereotype__ of a repository (also known as Data Access Object or DAO). Among the uses
of this marker is the automatic translation of exceptions as described in
<<orm-exception-translation>>.
@ -4988,15 +5047,16 @@ supported as a marker for automatic exception translation in your persistence la
[[beans-meta-annotations]]
=== Meta-annotations
Many of the annotations provided by Spring can be used as "meta-annotations" in
your own code. A meta-annotation is simply an annotation, that can be applied to another
annotation. For example, The `@Service` annotation mentioned above is meta-annotated with
your own code. A meta-annotation is simply an annotation that can be applied to another
annotation. For example, the `@Service` annotation mentioned above is meta-annotated with
with `@Component`:
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@Target({ElementType.TYPE})
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
**@Component** // Spring will see this and treat @Service in the same way as @Component
@ -5011,11 +5071,11 @@ Meta-annotations can also be combined together to create __composed annotations_
example, the `@RestController` annotation from Spring MVC is __composed__ of
`@Controller` and `@ResponseBody`.
With the exception of `value()`, meta-annotated types may redeclare attributes from the
source annotation to allow user customization. This can be particularly useful when you
want to only expose a subset of the source annotation attributes. For example, here is a
custom `@Scope` annotation that defines `session` scope, but still allows customization
of the `proxyMode`.
With the exception of the `value` attribute, composed annotations may redeclare
attributes from meta-annotations to allow user customization. This can be particularly
useful when you want to only expose a subset of the meta-annotation's attributes. For
example, here is a custom `@Scope` annotation that hardcodes the scope name to `session`
but still allows customization of the `proxyMode`.
[source,java,indent=0]
@ -5037,6 +5097,7 @@ of the `proxyMode`.
[[beans-scanning-autodetection]]
=== Automatically detecting classes and registering bean definitions
Spring can automatically detect stereotyped classes and register corresponding
++BeanDefinition++s with the `ApplicationContext`. For example, the following two classes
are eligible for such autodetection:
@ -5140,6 +5201,7 @@ with a value of false.
[[beans-scanning-filters]]
=== Using filters to customize scanning
By default, classes annotated with `@Component`, `@Repository`, `@Service`,
`@Controller`, or a custom annotation that itself is annotated with `@Component` are the
only detected candidate components. However, you can modify and extend this behavior
@ -5217,6 +5279,7 @@ will in effect disable automatic detection of classes annotated with `@Component
[[beans-factorybeans-annotations]]
=== Defining bean metadata within components
Spring components can also contribute bean definition metadata to the container. You do
this with the same `@Bean` annotation used to define bean metadata within `@Configuration`
annotated classes. Here is a simple example:
@ -5347,6 +5410,7 @@ inheritance being possible through Java 8 default methods as of Spring 4.2.
[[beans-scanning-name-generator]]
=== Naming autodetected components
When a component is autodetected as part of the scanning process, its bean name is
generated by the `BeanNameGenerator` strategy known to that scanner. By default, any
Spring stereotype annotation ( `@Component`, `@Repository`, `@Service`, and
@ -5412,6 +5476,7 @@ auto-generated names are adequate whenever the container is responsible for wiri
[[beans-scanning-scope-resolver]]
=== Providing a scope for autodetected components
As with Spring-managed components in general, the default and most common scope for
autodetected components is singleton. However, sometimes you need other scopes, which
Spring 2.5 provides with a new `@Scope` annotation. Simply provide the name of the scope
@ -5484,6 +5549,7 @@ the following configuration will result in standard JDK dynamic proxies:
[[beans-scanning-qualifiers]]
=== Providing qualifier metadata with annotations
The `@Qualifier` annotation is discussed in <<beans-autowired-annotation-qualifiers>>.
The examples in that section demonstrate the use of the `@Qualifier` annotation and
custom qualifier annotations to provide fine-grained control when you resolve autowire
@ -5680,6 +5746,7 @@ component-scanning in the exact same way as when using Spring annotations:
[[beans-standard-annotations-limitations]]
=== Limitations of the standard approach
When working with standard annotations, it is important to know that some significant
features are not available as shown in the table below:
@ -5796,6 +5863,7 @@ Java-based configuration.
[[beans-java-instantiating-container]]
=== Instantiating the Spring container using AnnotationConfigApplicationContext
The sections below document Spring's `AnnotationConfigApplicationContext`, new in Spring
3.0. This versatile `ApplicationContext` implementation is capable of accepting not only
`@Configuration` classes as input, but also plain `@Component` classes and classes
@ -5812,6 +5880,7 @@ used within those classes where necessary.
[[beans-java-instantiating-container-contstructor]]
==== Simple construction
In much the same way that Spring XML files are used as input when instantiating a
`ClassPathXmlApplicationContext`, `@Configuration` classes may be used as input when
instantiating an `AnnotationConfigApplicationContext`. This allows for completely
@ -6005,6 +6074,7 @@ You can use the `@Bean` annotation in a `@Configuration`-annotated or in a
[[beans-java-declaring-a-bean]]
==== Declaring a bean
To declare a bean, simply annotate a method with the `@Bean` annotation. You use this
method to register a bean definition within an `ApplicationContext` of the type
specified as the method's return value. By default, the bean name will be the same as
@ -6046,6 +6116,7 @@ transferService -> com.acme.TransferServiceImpl
[[beans-java-dependencies]]
==== Bean dependencies
A `@Bean` annotated method can have an arbitrary number of parameters describing the
dependencies required to build that bean. For instance if our `TransferService`
requires an `AccountRepository` we can materialize that dependency via a method
@ -6071,6 +6142,7 @@ injection, see <<beans-constructor-injection,the relevant section>> for more det
[[beans-java-lifecycle-callbacks]]
==== Receiving lifecycle callbacks
Any classes defined with the `@Bean` annotation support the regular lifecycle callbacks
and can use the `@PostConstruct` and `@PreDestroy` annotations from JSR-250, see
<<beans-postconstruct-and-predestroy-annotations,JSR-250 annotations>> for further
@ -6233,6 +6305,7 @@ link) to our `@Bean` using Java, it would look like the following:
[[beans-java-customizing-bean-naming]]
==== Customizing bean naming
By default, configuration classes use a `@Bean` method's name as the name of the
resulting bean. This functionality can be overridden, however, with the `name` attribute.
@ -6253,6 +6326,7 @@ resulting bean. This functionality can be overridden, however, with the `name` a
[[beans-java-bean-aliasing]]
==== Bean aliasing
As discussed in <<beans-beanname>>, it is sometimes desirable to give a single bean
multiple names, otherwise known as__bean aliasing__. The `name` attribute of the `@Bean`
annotation accepts a String array for this purpose.
@ -6274,6 +6348,7 @@ annotation accepts a String array for this purpose.
[[beans-java-bean-description]]
==== Bean description
Sometimes it is helpful to provide a more detailed textual description of a bean. This can
be particularly useful when beans are exposed (perhaps via JMX) for monitoring purposes.
@ -6308,6 +6383,7 @@ inter-bean dependencies. See <<beans-java-basic-concepts>> for a general introdu
[[beans-java-injecting-dependencies]]
==== Injecting inter-bean dependencies
When ++@Bean++s have dependencies on one another, expressing that dependency is as simple
as having one bean method call another:
@ -6343,6 +6419,7 @@ using plain `@Component` classes.
[[beans-java-method-injection]]
==== Lookup method injection
As noted earlier, <<beans-factory-method-injection,lookup method injection>> is an
advanced feature that you should use rarely. It is useful in cases where a
singleton-scoped bean has a dependency on a prototype-scoped bean. Using Java for this
@ -6396,6 +6473,7 @@ the abstract `createCommand()` method is overridden in such a way that it looks
[[beans-java-further-information-java-config]]
==== Further information about how Java-based configuration works internally
The following example shows a `@Bean` annotated method being called twice:
[source,java,indent=0]
@ -6730,10 +6808,11 @@ than the usual process of navigating interface-based code.
[[beans-java-conditional]]
==== Conditionally including @Configuration classes or @Beans
It is often useful to conditionally enable to disable a complete `@Configuration` class,
==== Conditionally include @Configuration classes or @Bean methods
It is often useful to conditionally enable or disable a complete `@Configuration` class,
or even individual `@Bean` methods, based on some arbitrary system state. One common
example of this it to use the `@Profile` annotation to active beans only when a specific
example of this is to use the `@Profile` annotation to activate beans only when a specific
profile has been enabled in the Spring `Environment` (see <<beans-definition-profiles>>
for details).
@ -6773,6 +6852,7 @@ See the {javadoc-baseurl}/org/springframework/context/annotation/Conditional.htm
[[beans-java-combining]]
==== Combining Java and XML configuration
Spring's `@Configuration` class support does not aim to be a 100% complete replacement
for Spring XML. Some facilities such as Spring XML namespaces remain an ideal way to
configure the container. In cases where XML is convenient or necessary, you have a
@ -6796,7 +6876,7 @@ Remember that `@Configuration` classes are ultimately just bean definitions in t
container. In this example, we create a `@Configuration` class named `AppConfig` and
include it within `system-test-config.xml` as a `<bean/>` definition. Because
`<context:annotation-config/>` is switched on, the container will recognize the
`@Configuration` annotation, and process the `@Bean` methods declared in `AppConfig`
`@Configuration` annotation and process the `@Bean` methods declared in `AppConfig`
properly.
[source,java,indent=0]
@ -6821,10 +6901,11 @@ properly.
}
----
*system-test-config.xml*:
[source,xml,indent=0]
[subs="verbatim,quotes"]
----
system-test-config.xml
<beans>
<!-- enable processing of annotations such as @Autowired and @Configuration -->
<context:annotation-config/>
@ -6840,10 +6921,11 @@ properly.
</beans>
----
*jdbc.properties*:
[literal]
[subs="verbatim,quotes"]
----
jdbc.properties
jdbc.url=jdbc:hsqldb:hsql://localhost/xdb
jdbc.username=sa
jdbc.password=
@ -6861,11 +6943,11 @@ jdbc.password=
[NOTE]
====
In `system-test-config.xml` above, the `AppConfig<bean/>` does not declare an `id`
In `system-test-config.xml` above, the `AppConfig` `<bean/>` does not declare an `id`
element. While it would be acceptable to do so, it is unnecessary given that no other
bean will ever refer to it, and it is unlikely that it will be explicitly fetched from
the container by name. Likewise with the `DataSource` bean - it is only ever autowired
by type, so an explicit bean id is not strictly required.
by type, so an explicit bean `id` is not strictly required.
====
--
@ -6875,13 +6957,14 @@ Because `@Configuration` is meta-annotated with `@Component`, `@Configuration`-a
classes are automatically candidates for component scanning. Using the same scenario as
above, we can redefine `system-test-config.xml` to take advantage of component-scanning.
Note that in this case, we don't need to explicitly declare
`<context:annotation-config/>`, because `<context:component-scan/>` enables all the same
`<context:annotation-config/>`, because `<context:component-scan/>` enables the same
functionality.
*system-test-config.xml*:
[source,xml,indent=0]
[subs="verbatim,quotes"]
----
system-test-config.xml
<beans>
<!-- picks up and registers AppConfig as a bean definition -->
<context:component-scan base-package="com.acme"/>
@ -7043,9 +7126,9 @@ this need.
==== @Profile
The {javadoc-baseurl}/org/springframework/context/annotation/Profile.html[`@Profile`]
annotation allows to indicate that a component is eligible for registration
annotation allows you to indicate that a component is eligible for registration
when one or more specified profiles are active. Using our example above, we
can rewrite the _dataSource_ configuration as follows:
can rewrite the `dataSource` configuration as follows:
[source,java,indent=0]
[subs="verbatim,quotes"]
@ -7081,9 +7164,9 @@ can rewrite the _dataSource_ configuration as follows:
----
`@Profile` can be used as a meta-annotation, for the purpose of composing
custom stereotype annotations. The following example defines a `@Production`
custom annotation that can be used as a drop-in replacement of
`@Profile` can be used as a <<beans-meta-annotations,meta-annotation>> for the purpose
of creating a custom _composed annotation_. The following example defines a custom
`@Production` annotation that can be used as a drop-in replacement for
`@Profile("production")`:
[source,java,indent=0]
@ -7096,8 +7179,8 @@ custom annotation that can be used as a drop-in replacement of
}
----
`@Profile` can also be specified at method-level to include only one particular
bean of a configuration class:
`@Profile` can also be declared at the method level to include only one particular bean
of a configuration class:
[source,java,indent=0]
[subs="verbatim,quotes"]
@ -7126,22 +7209,21 @@ bean of a configuration class:
[TIP]
====
If a `@Configuration` class is marked with `@Profile`, all of the `@Bean` methods
and `@Import` annotations associated with that class will be bypassed unless one
or more of the specified profiles are active. If a `@Component` or `@Configuration`
class is marked with `@Profile({"p1", "p2"})`, that class will not be registered/
processed unless profiles 'p1' and/or 'p2' have been activated. If a given profile
is prefixed with the NOT operator (`!`), the annotated element will be registered
if the profile is **not** active. e.g., for `@Profile({"p1", "!p2"})`, registration
will occur if profile 'p1' is active or if profile 'p2' is not active.
If a `@Configuration` class is marked with `@Profile`, all of the `@Bean` methods and
`@Import` annotations associated with that class will be bypassed unless one or more of
the specified profiles are active. If a `@Component` or `@Configuration` class is marked
with `@Profile({"p1", "p2"})`, that class will not be registered/processed unless
profiles 'p1' and/or 'p2' have been activated. If a given profile is prefixed with the
NOT operator (`!`), the annotated element will be registered if the profile is **not**
active. For example, given `@Profile({"p1", "!p2"})`, registration will occur if profile
'p1' is active or if profile 'p2' is not active.
====
[[beans-definition-profiles-xml]]
=== XML Bean definition profiles
=== XML bean definition profiles
The XML counterpart is an update of the `beans` element that accepts a
`profile` attribute. Our sample configuration above can be rewritten in two XML
files as follows:
The XML counterpart is the `profile` attribute of the `<beans>` element. Our sample
configuration above can be rewritten in two XML files as follows:
[source,xml,indent=0]
[subs="verbatim,quotes"]
@ -7203,15 +7285,16 @@ last ones in the file. This should help provide flexibility without incurring
clutter in the XML files.
[[beans-definition-profiles-enable]]
==== Enabling a profile
==== Activating a profile
Now that we have updated our configuration, we still need to instruct which
Now that we have updated our configuration, we still need to instruct Spring which
profile is active. If we started our sample application right now, we would see
a `NoSuchBeanDefinitionException` thrown, because the container could not find
the Spring bean named `dataSource`.
Activating a profile can be done in several ways, but the most straightforward
is to do it programmatically against the `ApplicationContext` API:
Activating a profile can be done in several ways, but the most straightforward is to do
it programmatically against the `Environment` API which is available via an
`ApplicationContext`:
[source,java,indent=0]
[subs="verbatim,quotes"]
@ -7222,10 +7305,12 @@ is to do it programmatically against the `ApplicationContext` API:
ctx.refresh();
----
In addition, profiles may also be activated declaratively through the `spring.profiles.active`
property which may be specified through system environment variables, JVM system properties,
servlet context parameters in `web.xml` or even as an entry in JNDI (see
<<beans-property-source-abstraction>>).
In addition, profiles may also be activated declaratively through the
`spring.profiles.active` property which may be specified through system environment
variables, JVM system properties, servlet context parameters in `web.xml`, or even as an
entry in JNDI (see <<beans-property-source-abstraction>>). In integration tests, active
profiles can be declared via the `@ActiveProfiles` annotation in the `spring-test` module
(see <<testcontext-ctx-management-env-profiles>>).
Note that profiles are not an "either-or" proposition; it is possible to activate multiple
profiles at once. Programmatically, simply provide multiple profile names to the
@ -7248,7 +7333,7 @@ Declaratively, `spring.profiles.active` may accept a comma-separated list of pro
[[beans-definition-profiles-default]]
==== Default profile
The _default_ profile represents the profile that is enabled by default. Consider the
The _default_ profile represents the profile that is enabled by default. Consider the
following:
[source,java,indent=0]
@ -7272,13 +7357,13 @@ If no profile is active, the `dataSource` above will be created; this can be
seen as a way to provide a _default_ definition for one or more beans. If any
profile is enabled, the _default_ profile will not apply.
The name of that default profile can be changed using `setDefaultProfiles` on
The name of the default profile can be changed using `setDefaultProfiles()` on
the `Environment` or declaratively using the `spring.profiles.default` property.
[[beans-property-source-abstraction]]
=== PropertySource Abstraction
=== PropertySource abstraction
Spring's Environment abstraction provides search operations over a configurable
Spring's `Environment` abstraction provides search operations over a configurable
hierarchy of property sources. To explain fully, consider the following:
[source,java,indent=0]
@ -7695,6 +7780,7 @@ out the `ReloadableResourceBundleMessageSource` javadocs for details.
[[context-functionality-events]]
=== Standard and Custom Events
Event handling in the `ApplicationContext` is provided through the `ApplicationEvent`
class and `ApplicationListener` interface. If a bean that implements the
`ApplicationListener` interface is deployed into the context, every time an
@ -8058,6 +8144,7 @@ an event.
[[context-functionality-resources]]
=== Convenient access to low-level resources
For optimal usage and understanding of application contexts, users should generally
familiarize themselves with Spring's `Resource` abstraction, as described in the chapter
<<resources>>.
@ -8124,6 +8211,7 @@ in any subdirectory of "WEB-INF".
[[context-deploy-rar]]
=== Deploying a Spring ApplicationContext as a Java EE RAR file
It is possible to deploy a Spring ApplicationContext as a RAR file, encapsulating the
context and all of its required bean classes and library JARs in a Java EE RAR deployment
unit. This is the equivalent of bootstrapping a standalone ApplicationContext, just hosted
@ -8269,6 +8357,7 @@ important functionality such as property placeholder replacement and AOP.
[[beans-servicelocator]]
=== Glue code and the evil singleton
It is best to write most application code in a dependency-injection (DI) style, where
that code is served out of a Spring IoC container, has its own dependencies supplied by
the container when it is created, and is completely unaware of the container. However,

View File

@ -96,7 +96,7 @@ then combine attributes from both annotations to create merged CORS configuratio
@RequestMapping("/account")
public class AccountController {
@CrossOrigin(origins = "http://domain2.com")
@CrossOrigin("http://domain2.com")
@RequestMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...

View File

@ -627,7 +627,7 @@ to narrow the mapping.
[[mvc-ann-requestmapping-proxying]]
==== ++@Controller++'s and AOP Proxying
==== @Controller and AOP Proxying
In some cases a controller may need to be decorated with an AOP proxy at runtime.
One example is if you choose to have `@Transactional` annotations directly on the
@ -1910,7 +1910,8 @@ which case they apply to matching controllers. This provides an alternative to u
[[mvc-ann-controller-advice]]
==== Advising controllers with the `@ControllerAdvice` annotation
==== Advising controllers with @ControllerAdvice
The `@ControllerAdvice` annotation is a component annotation allowing implementation
classes to be auto-detected through classpath scanning. It is automatically enabled when
using the MVC namespace or the MVC Java config.
@ -2518,11 +2519,6 @@ directly on `RequestMappingHandlerAdapter`.
[[mvc-viewresolver]]
== Resolving views
All MVC frameworks for web applications provide a way to address views. Spring provides

View File

@ -1554,7 +1554,7 @@ the TCP connection is established is different from the host providing the
cloud-based STOMP service.
[[websocket-stomp-destination-separator]]
=== Using Dot as Separator in `@MessageMapping` Destinations
=== Using Dot as Separator in @MessageMapping Destinations
Although slash-separated path patterns are familiar to web developers, in messaging
it is common to use a "." as the separator, for example in the names of topics, queues,