|
|
|
@ -37,18 +37,18 @@ Kotlin:: |
|
|
|
---- |
|
|
|
---- |
|
|
|
====== |
|
|
|
====== |
|
|
|
|
|
|
|
|
|
|
|
[NOTE] |
|
|
|
[TIP] |
|
|
|
==== |
|
|
|
==== |
|
|
|
As of Spring Framework 4.3, an `@Autowired` annotation on such a constructor is no longer |
|
|
|
An `@Autowired` annotation on such a constructor is not necessary if the target bean |
|
|
|
necessary if the target bean defines only one constructor to begin with. However, if |
|
|
|
defines only one constructor. However, if several constructors are available and there is |
|
|
|
several constructors are available and there is no primary/default constructor, at least |
|
|
|
no primary or default constructor, at least one of the constructors must be annotated |
|
|
|
one of the constructors must be annotated with `@Autowired` in order to instruct the |
|
|
|
with `@Autowired` in order to instruct the container which one to use. See the discussion |
|
|
|
container which one to use. See the discussion on |
|
|
|
on xref:core/beans/annotation-config/autowired.adoc#beans-autowired-annotation-constructor-resolution[constructor resolution] |
|
|
|
xref:core/beans/annotation-config/autowired.adoc#beans-autowired-annotation-constructor-resolution[constructor resolution] for details. |
|
|
|
for details. |
|
|
|
==== |
|
|
|
==== |
|
|
|
|
|
|
|
|
|
|
|
You can also apply the `@Autowired` annotation to _traditional_ setter methods, |
|
|
|
You can apply the `@Autowired` annotation to _traditional_ setter methods, as the |
|
|
|
as the following example shows: |
|
|
|
following example shows: |
|
|
|
|
|
|
|
|
|
|
|
[tabs] |
|
|
|
[tabs] |
|
|
|
====== |
|
|
|
====== |
|
|
|
@ -84,8 +84,8 @@ Kotlin:: |
|
|
|
---- |
|
|
|
---- |
|
|
|
====== |
|
|
|
====== |
|
|
|
|
|
|
|
|
|
|
|
You can also apply the annotation to methods with arbitrary names and multiple |
|
|
|
You can apply `@Autowired` to methods with arbitrary names and multiple arguments, as the |
|
|
|
arguments, as the following example shows: |
|
|
|
following example shows: |
|
|
|
|
|
|
|
|
|
|
|
[tabs] |
|
|
|
[tabs] |
|
|
|
====== |
|
|
|
====== |
|
|
|
@ -176,14 +176,15 @@ Kotlin:: |
|
|
|
==== |
|
|
|
==== |
|
|
|
Make sure that your target components (for example, `MovieCatalog` or `CustomerPreferenceDao`) |
|
|
|
Make sure that your target components (for example, `MovieCatalog` or `CustomerPreferenceDao`) |
|
|
|
are consistently declared by the type that you use for your `@Autowired`-annotated |
|
|
|
are consistently declared by the type that you use for your `@Autowired`-annotated |
|
|
|
injection points. Otherwise, injection may fail due to a "no type match found" error at runtime. |
|
|
|
injection points. Otherwise, injection may fail due to a "no type match found" error at |
|
|
|
|
|
|
|
runtime. |
|
|
|
|
|
|
|
|
|
|
|
For XML-defined beans or component classes found via classpath scanning, the container |
|
|
|
For XML-defined beans or component classes found via classpath scanning, the container |
|
|
|
usually knows the concrete type up front. However, for `@Bean` factory methods, you need |
|
|
|
usually knows the concrete type up front. However, for `@Bean` factory methods, you need |
|
|
|
to make sure that the declared return type is sufficiently expressive. For components |
|
|
|
to make sure that the declared return type is sufficiently expressive. For components |
|
|
|
that implement several interfaces or for components potentially referred to by their |
|
|
|
that implement several interfaces or for components potentially referred to by their |
|
|
|
implementation type, consider declaring the most specific return type on your factory |
|
|
|
implementation type, declare the most specific return type on your factory method (at |
|
|
|
method (at least as specific as required by the injection points referring to your bean). |
|
|
|
least as specific as required by the injection points referring to your bean). |
|
|
|
==== |
|
|
|
==== |
|
|
|
|
|
|
|
|
|
|
|
.[[beans-autowired-annotation-self-injection]]Self Injection |
|
|
|
.[[beans-autowired-annotation-self-injection]]Self Injection |
|
|
|
@ -312,8 +313,8 @@ through `@Order` values in combination with `@Primary` on a single bean for each |
|
|
|
==== |
|
|
|
==== |
|
|
|
|
|
|
|
|
|
|
|
Even typed `Map` instances can be autowired as long as the expected key type is `String`. |
|
|
|
Even typed `Map` instances can be autowired as long as the expected key type is `String`. |
|
|
|
The map values contain all beans of the expected type, and the keys contain the |
|
|
|
The map values are all beans of the expected type, and the keys are the corresponding |
|
|
|
corresponding bean names, as the following example shows: |
|
|
|
bean names, as the following example shows: |
|
|
|
|
|
|
|
|
|
|
|
[tabs] |
|
|
|
[tabs] |
|
|
|
====== |
|
|
|
====== |
|
|
|
@ -431,7 +432,7 @@ annotated constructor does not have to be public. |
|
|
|
==== |
|
|
|
==== |
|
|
|
|
|
|
|
|
|
|
|
Alternatively, you can express the non-required nature of a particular dependency |
|
|
|
Alternatively, you can express the non-required nature of a particular dependency |
|
|
|
through Java 8's `java.util.Optional`, as the following example shows: |
|
|
|
through Java's `java.util.Optional`, as the following example shows: |
|
|
|
|
|
|
|
|
|
|
|
[source,java,indent=0,subs="verbatim,quotes"] |
|
|
|
[source,java,indent=0,subs="verbatim,quotes"] |
|
|
|
---- |
|
|
|
---- |
|
|
|
@ -521,5 +522,6 @@ class MovieRecommender { |
|
|
|
The `@Autowired`, `@Inject`, `@Value`, and `@Resource` annotations are handled by Spring |
|
|
|
The `@Autowired`, `@Inject`, `@Value`, and `@Resource` annotations are handled by Spring |
|
|
|
`BeanPostProcessor` implementations. This means that you cannot apply these annotations |
|
|
|
`BeanPostProcessor` implementations. This means that you cannot apply these annotations |
|
|
|
within your own `BeanPostProcessor` or `BeanFactoryPostProcessor` types (if any). |
|
|
|
within your own `BeanPostProcessor` or `BeanFactoryPostProcessor` types (if any). |
|
|
|
|
|
|
|
|
|
|
|
These types must be 'wired up' explicitly by using XML or a Spring `@Bean` method. |
|
|
|
These types must be 'wired up' explicitly by using XML or a Spring `@Bean` method. |
|
|
|
==== |
|
|
|
==== |
|
|
|
|