Skip to content

Commit 4eb93da

Browse files
committed
Merge branch '6.1.x'
# Conflicts: # spring-beans/src/main/java/org/springframework/beans/factory/support/GenericTypeAwareAutowireCandidateResolver.java
2 parents cabd1f5 + f2889b1 commit 4eb93da

File tree

5 files changed

+342
-250
lines changed

5 files changed

+342
-250
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java

Lines changed: 57 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -524,42 +524,73 @@ protected boolean isTypeMatch(String name, ResolvableType typeToMatch, boolean a
524524
// Check manually registered singletons.
525525
Object beanInstance = getSingleton(beanName, false);
526526
if (beanInstance != null && beanInstance.getClass() != NullBean.class) {
527+
528+
// Determine target for FactoryBean match if necessary.
527529
if (beanInstance instanceof FactoryBean<?> factoryBean) {
528530
if (!isFactoryDereference) {
529531
Class<?> type = getTypeForFactoryBean(factoryBean);
530-
return (type != null && typeToMatch.isAssignableFrom(type));
531-
}
532-
else {
533-
return typeToMatch.isInstance(beanInstance);
534-
}
535-
}
536-
else if (!isFactoryDereference) {
537-
if (typeToMatch.isInstance(beanInstance)) {
538-
// Direct match for exposed instance?
539-
return true;
540-
}
541-
else if (typeToMatch.hasGenerics() && containsBeanDefinition(beanName)) {
542-
// Generics potentially only match on the target class, not on the proxy...
543-
RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
544-
Class<?> targetType = mbd.getTargetType();
545-
if (targetType != null && targetType != ClassUtils.getUserClass(beanInstance)) {
546-
// Check raw class match as well, making sure it's exposed on the proxy.
547-
Class<?> classToMatch = typeToMatch.resolve();
548-
if (classToMatch != null && !classToMatch.isInstance(beanInstance)) {
532+
if (type == null) {
533+
return false;
534+
}
535+
if (typeToMatch.isAssignableFrom(type)) {
536+
return true;
537+
}
538+
else if (typeToMatch.hasGenerics() && containsBeanDefinition(beanName)) {
539+
RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
540+
ResolvableType targetType = mbd.targetType;
541+
if (targetType == null) {
542+
targetType = mbd.factoryMethodReturnType;
543+
}
544+
if (targetType == null) {
549545
return false;
550546
}
551-
if (typeToMatch.isAssignableFrom(targetType)) {
552-
return true;
547+
Class<?> targetClass = targetType.resolve();
548+
if (targetClass != null && FactoryBean.class.isAssignableFrom(targetClass)) {
549+
Class<?> classToMatch = typeToMatch.resolve();
550+
if (classToMatch != null && !FactoryBean.class.isAssignableFrom(classToMatch) &&
551+
!classToMatch.isAssignableFrom(targetType.toClass())) {
552+
return typeToMatch.isAssignableFrom(targetType.getGeneric());
553+
}
554+
}
555+
else {
556+
return typeToMatch.isAssignableFrom(targetType);
553557
}
554558
}
555-
ResolvableType resolvableType = mbd.targetType;
556-
if (resolvableType == null) {
557-
resolvableType = mbd.factoryMethodReturnType;
559+
return false;
560+
}
561+
}
562+
else if (isFactoryDereference) {
563+
return false;
564+
}
565+
566+
// Actual matching against bean instance...
567+
if (typeToMatch.isInstance(beanInstance)) {
568+
// Direct match for exposed instance?
569+
return true;
570+
}
571+
else if (typeToMatch.hasGenerics() && containsBeanDefinition(beanName)) {
572+
// Generics potentially only match on the target class, not on the proxy...
573+
RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
574+
Class<?> targetType = mbd.getTargetType();
575+
if (targetType != null && targetType != ClassUtils.getUserClass(beanInstance)) {
576+
// Check raw class match as well, making sure it's exposed on the proxy.
577+
Class<?> classToMatch = typeToMatch.resolve();
578+
if (classToMatch != null && !classToMatch.isInstance(beanInstance)) {
579+
return false;
558580
}
559-
return (resolvableType != null && typeToMatch.isAssignableFrom(resolvableType));
581+
if (typeToMatch.isAssignableFrom(targetType)) {
582+
return true;
583+
}
584+
}
585+
ResolvableType resolvableType = mbd.targetType;
586+
if (resolvableType == null) {
587+
resolvableType = mbd.factoryMethodReturnType;
560588
}
589+
return (resolvableType != null && typeToMatch.isAssignableFrom(resolvableType));
590+
}
591+
else {
592+
return false;
561593
}
562-
return false;
563594
}
564595
else if (containsSingleton(beanName) && !containsBeanDefinition(beanName)) {
565596
// null instance registered

spring-beans/src/main/java/org/springframework/beans/factory/support/GenericTypeAwareAutowireCandidateResolver.java

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -103,23 +103,6 @@ protected boolean checkGenericTypeMatch(BeanDefinitionHolder bdHolder, Dependenc
103103
}
104104
}
105105
}
106-
else {
107-
// Pre-existing target type: In case of a generic FactoryBean type,
108-
// unwrap nested generic type when matching a non-FactoryBean type.
109-
Class<?> resolvedClass = targetType.resolve();
110-
if (resolvedClass != null && FactoryBean.class.isAssignableFrom(resolvedClass)) {
111-
Class<?> typeToBeMatched = dependencyType.resolve();
112-
if (typeToBeMatched != null && !FactoryBean.class.isAssignableFrom(typeToBeMatched) &&
113-
!typeToBeMatched.isAssignableFrom(resolvedClass)) {
114-
targetType = targetType.getGeneric();
115-
if (descriptor.fallbackMatchAllowed()) {
116-
// Matching the Class-based type determination for FactoryBean
117-
// objects in the lazy-determination getType code path below.
118-
targetType = ResolvableType.forClass(targetType.resolve());
119-
}
120-
}
121-
}
122-
}
123106
}
124107

125108
if (targetType == null) {
@@ -146,6 +129,23 @@ protected boolean checkGenericTypeMatch(BeanDefinitionHolder bdHolder, Dependenc
146129
if (cacheType) {
147130
rbd.targetType = targetType;
148131
}
132+
133+
// Pre-declared target type: In case of a generic FactoryBean type,
134+
// unwrap nested generic type when matching a non-FactoryBean type.
135+
Class<?> targetClass = targetType.resolve();
136+
if (targetClass != null && FactoryBean.class.isAssignableFrom(targetClass)) {
137+
Class<?> classToMatch = dependencyType.resolve();
138+
if (classToMatch != null && !FactoryBean.class.isAssignableFrom(classToMatch) &&
139+
!classToMatch.isAssignableFrom(targetClass)) {
140+
targetType = targetType.getGeneric();
141+
if (descriptor.fallbackMatchAllowed()) {
142+
// Matching the Class-based type determination for FactoryBean
143+
// objects in the lazy-determination getType code path above.
144+
targetType = ResolvableType.forClass(targetType.resolve());
145+
}
146+
}
147+
}
148+
149149
if (descriptor.fallbackMatchAllowed()) {
150150
// Fallback matches allow unresolvable generics, e.g. plain HashMap to Map<String,String>;
151151
// and pragmatically also java.util.Properties to any Map (since despite formally being a

0 commit comments

Comments
 (0)