Extended coverage of full vs lite mode for configuration classes

Issue: SPR-16076
This commit is contained in:
Juergen Hoeller 2017-10-16 23:02:35 +02:00
parent 77bab959a3
commit 17fb4fed09
1 changed files with 22 additions and 12 deletions

View File

@ -4626,6 +4626,7 @@ The corresponding bean definitions appear as follows.
---- ----
[[beans-autowired-annotation-qualifiers]] [[beans-autowired-annotation-qualifiers]]
=== Fine-tuning annotation-based autowiring with qualifiers === Fine-tuning annotation-based autowiring with qualifiers
@ -5043,7 +5044,6 @@ Generic qualifiers also apply when autowiring Lists, Maps and Arrays:
[[beans-custom-autowire-configurer]] [[beans-custom-autowire-configurer]]
=== CustomAutowireConfigurer === CustomAutowireConfigurer
@ -6138,27 +6138,37 @@ The `AppConfig` class above would be equivalent to the following Spring `<beans/
</beans> </beans>
---- ----
.Full @Configuration vs 'lite' @Beans mode? .Full @Configuration vs 'lite' @Bean mode?
**** ****
When `@Bean` methods are declared within classes that are __not__ annotated with When `@Bean` methods are declared within classes that are __not__ annotated with
`@Configuration` they are referred to as being processed in a 'lite' mode. For example, `@Configuration` they are referred to as being processed in a 'lite' mode. Bean methods
bean methods declared in a `@Component` or even in a __plain old class__ will be declared in a `@Component` or even in a __plain old class__ will be considered 'lite',
considered 'lite'. with a different primary purpose of the containing class and an `@Bean` method just
being a sort of bonus there. For example, service components may expose management views
to the container through an additional `@Bean` method on each applicable component class.
In such scenarios, `@Bean` methods are a simple general-purpose factory method mechanism.
Unlike full `@Configuration`, lite `@Bean` methods cannot easily declare inter-bean Unlike full `@Configuration`, lite `@Bean` methods cannot declare inter-bean dependencies.
dependencies. Usually one `@Bean` method should not invoke another `@Bean` method when Instead, they operate on their containing component's internal state and optionally on
operating in 'lite' mode. arguments that they may declare. Such an `@Bean` method should therefore not invoke other
`@Bean` methods; each such method is literally just a factory method for a particular
bean reference, without any special runtime semantics. The positive side-effect here is
that no CGLIB subclassing has to be applied at runtime, so there are no limitations in
terms of class design (i.e. the containing class may nevertheless be `final` etc).
Only using `@Bean` methods within `@Configuration` classes is a recommended approach of In common scenarios, `@Bean` methods are to be declared within `@Configuration` classes,
ensuring that 'full' mode is always used. This will prevent the same `@Bean` method from ensuring that 'full' mode is always used and that cross-method references will therefore
accidentally being invoked multiple times and helps to reduce subtle bugs that can be get redirected to the container's lifecycle management. This will prevent the same
hard to track down when operating in 'lite' mode. `@Bean` method from accidentally being invoked through a regular Java call which helps
to reduce subtle bugs that can be hard to track down when operating in 'lite' mode.
**** ****
The `@Bean` and `@Configuration` annotations will be discussed in depth in the sections The `@Bean` and `@Configuration` annotations will be discussed in depth in the sections
below. First, however, we'll cover the various ways of creating a spring container using below. First, however, we'll cover the various ways of creating a spring container using
Java-based configuration. Java-based configuration.
[[beans-java-instantiating-container]] [[beans-java-instantiating-container]]
=== Instantiating the Spring container using AnnotationConfigApplicationContext === Instantiating the Spring container using AnnotationConfigApplicationContext