Avoid implicit autowiring with Kotlin secondary ctors
Autowiring implicitely Kotlin primary constructors when there are secondary constructors has side effects on ConstructorResolver. It seems reasonable to require explicit @Autowired annotation in such case. With this commit, implicit autowiring of Kotlin primary constructors is only performed when there is a primary constructor defined alone or with a default constructor (define explicitly or generated via the kotlin-noarg compiler plugin or via optional constructor parameters with default values). Issue: SPR-16022
This commit is contained in:
@@ -284,8 +284,12 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean
|
||||
Constructor<?> requiredConstructor = null;
|
||||
Constructor<?> defaultConstructor = null;
|
||||
Constructor<?> primaryConstructor = BeanUtils.findPrimaryConstructor(beanClass);
|
||||
int nonSyntheticConstructors = 0;
|
||||
for (Constructor<?> candidate : rawCandidates) {
|
||||
if (primaryConstructor != null && candidate.isSynthetic()) {
|
||||
if (!candidate.isSynthetic()) {
|
||||
nonSyntheticConstructors++;
|
||||
}
|
||||
else if (primaryConstructor != null) {
|
||||
continue;
|
||||
}
|
||||
AnnotationAttributes ann = findAutowiredAnnotation(candidate);
|
||||
@@ -343,10 +347,11 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean
|
||||
else if (rawCandidates.length == 1 && rawCandidates[0].getParameterCount() > 0) {
|
||||
candidateConstructors = new Constructor<?>[] {rawCandidates[0]};
|
||||
}
|
||||
else if (primaryConstructor != null) {
|
||||
candidateConstructors = (defaultConstructor != null ?
|
||||
new Constructor<?>[] {primaryConstructor, defaultConstructor} :
|
||||
new Constructor<?>[] {primaryConstructor});
|
||||
else if (nonSyntheticConstructors == 2 && primaryConstructor != null && defaultConstructor != null) {
|
||||
candidateConstructors = new Constructor<?>[] {primaryConstructor, defaultConstructor};
|
||||
}
|
||||
else if (nonSyntheticConstructors == 1 && primaryConstructor != null) {
|
||||
candidateConstructors = new Constructor<?>[] {primaryConstructor};
|
||||
}
|
||||
else {
|
||||
candidateConstructors = new Constructor<?>[0];
|
||||
|
||||
Reference in New Issue
Block a user