Browse Source

Merge branch '5.1.x'

pull/23315/head
Sam Brannen 7 years ago
parent
commit
56eadff34f
  1. 20
      spring-beans/src/main/java/org/springframework/beans/factory/annotation/Autowired.java
  2. 22
      src/docs/asciidoc/core/core-beans.adoc

20
spring-beans/src/main/java/org/springframework/beans/factory/annotation/Autowired.java

@ -28,15 +28,17 @@ import java.lang.annotation.Target;
* {@link javax.inject.Inject} annotation, adding required-vs-optional semantics. * {@link javax.inject.Inject} annotation, adding required-vs-optional semantics.
* *
* <h3>Autowired Constructors</h3> * <h3>Autowired Constructors</h3>
* <p>Only one constructor (at max) of any given bean class may declare this annotation * <p>Only one constructor of any given bean class may declare this annotation with
* with the 'required' parameter set to {@code true}, indicating <i>the</i> constructor * the 'required' attribute set to {@code true}, indicating <i>the</i> constructor
* to autowire when used as a Spring bean. If multiple <i>non-required</i> constructors * to autowire when used as a Spring bean. Furthermore, if the 'required' attribute
* declare the annotation, they will be considered as candidates for autowiring. * is set to {@code true}, only a single constructor may be annotated with
* The constructor with the greatest number of dependencies that can be satisfied by * {@code @Autowired}. If multiple <i>non-required</i> constructors declare the
* matching beans in the Spring container will be chosen. If none of the candidates * annotation, they will be considered as candidates for autowiring. The constructor
* can be satisfied, then a primary/default constructor (if present) will be used. * with the greatest number of dependencies that can be satisfied by matching beans
* If a class only declares a single constructor to begin with, it will always be used, * in the Spring container will be chosen. If none of the candidates can be satisfied,
* even if not annotated. An annotated constructor does not have to be public. * then a primary/default constructor (if present) will be used. If a class only
* declares a single constructor to begin with, it will always be used, even if not
* annotated. An annotated constructor does not have to be public.
* *
* <h3>Autowired Fields</h3> * <h3>Autowired Fields</h3>
* <p>Fields are injected right after construction of a bean, before any config methods * <p>Fields are injected right after construction of a bean, before any config methods

22
src/docs/asciidoc/core/core-beans.adoc

@ -4538,15 +4538,19 @@ e.g. declared as a single public constructor without an `@Autowired` annotation.
[NOTE] [NOTE]
==== ====
Only one annotated constructor per class can be marked as required, but multiple Only one constructor of any given bean class may declare `@Autowired` with the `required`
non-required constructors can be annotated. In that case, each is considered among attribute set to `true`, indicating _the_ constructor to autowire when used as a Spring
the candidates and Spring uses the greediest constructor whose dependencies can be bean. Furthermore, if the `required` attribute is set to `true`, only a single
satisfied -- that is, the constructor that has the largest number of arguments. constructor may be annotated with `@Autowired`. If multiple _non-required_ constructors
The constructor resolution algorithm is the same as for non-annotated classes with declare the annotation, they will be considered as candidates for autowiring. The
overloaded constructors, just narrowing the candidates to annotated constructors. constructor with the greatest number of dependencies that can be satisfied by matching
beans in the Spring container will be chosen. If none of the candidates can be satisfied,
The 'required' attribute of `@Autowired` is recommended over the `@Required` annotation then a primary/default constructor (if present) will be used. If a class only declares a
on setter methods. The 'required' attribute indicates that the property is not required single constructor to begin with, it will always be used, even if not annotated. An
annotated constructor does not have to be public.
The `required` attribute of `@Autowired` is recommended over the `@Required` annotation
on setter methods. The `required` attribute indicates that the property is not required
for autowiring purposes. The property is ignored if it cannot be autowired. `@Required`, for autowiring purposes. The property is ignored if it cannot be autowired. `@Required`,
on the other hand, is stronger in that it enforces the property to be set by any means on the other hand, is stronger in that it enforces the property to be set by any means
supported by the container. If no value is defined, a corresponding exception is raised. supported by the container. If no value is defined, a corresponding exception is raised.

Loading…
Cancel
Save