Merge branch '6.1.x'

# Conflicts:
#	spring-beans/src/main/java/org/springframework/beans/factory/support/GenericTypeAwareAutowireCandidateResolver.java
This commit is contained in:
Juergen Hoeller
2024-04-08 22:41:02 +02:00
5 changed files with 346 additions and 254 deletions

View File

@@ -409,15 +409,17 @@ class AnnotationConfigApplicationContextTests {
bd2.setTargetType(ResolvableType.forClassWithGenerics(FactoryBean.class, ResolvableType.forClassWithGenerics(GenericHolder.class, Integer.class)));
bd2.setLazyInit(true);
context.registerBeanDefinition("fb2", bd2);
context.registerBeanDefinition("ip", new RootBeanDefinition(FactoryBeanInjectionPoints.class));
RootBeanDefinition bd3 = new RootBeanDefinition(FactoryBeanInjectionPoints.class);
bd3.setScope(RootBeanDefinition.SCOPE_PROTOTYPE);
context.registerBeanDefinition("ip", bd3);
context.refresh();
assertThat(context.getBean("ip", FactoryBeanInjectionPoints.class).factoryBean).isSameAs(context.getBean("&fb1"));
assertThat(context.getBean("ip", FactoryBeanInjectionPoints.class).factoryResult).isSameAs(context.getBean("fb1"));
assertThat(context.getType("&fb1")).isEqualTo(GenericHolderFactoryBean.class);
assertThat(context.getType("fb1")).isEqualTo(GenericHolder.class);
assertThat(context.getBeanNamesForType(FactoryBean.class)).hasSize(2);
assertThat(context.getBeanNamesForType(GenericHolderFactoryBean.class)).hasSize(1);
assertThat(context.getBean("ip", FactoryBeanInjectionPoints.class).factoryBean).isSameAs(context.getBean("&fb1"));
assertThat(context.getBean("ip", FactoryBeanInjectionPoints.class).factoryResult).isSameAs(context.getBean("fb1"));
}
@Test
@@ -425,7 +427,7 @@ class AnnotationConfigApplicationContextTests {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
RootBeanDefinition bd1 = new RootBeanDefinition();
bd1.setBeanClass(GenericHolderFactoryBean.class);
bd1.setTargetType(ResolvableType.forClassWithGenerics(FactoryBean.class, ResolvableType.forClassWithGenerics(GenericHolder.class, Object.class)));
bd1.setTargetType(ResolvableType.forClassWithGenerics(FactoryBean.class, ResolvableType.forClassWithGenerics(GenericHolder.class, String.class)));
bd1.setLazyInit(true);
context.registerBeanDefinition("fb1", bd1);
RootBeanDefinition bd2 = new RootBeanDefinition();
@@ -433,13 +435,19 @@ class AnnotationConfigApplicationContextTests {
bd2.setTargetType(ResolvableType.forClassWithGenerics(FactoryBean.class, ResolvableType.forClassWithGenerics(GenericHolder.class, Integer.class)));
bd2.setLazyInit(true);
context.registerBeanDefinition("fb2", bd2);
context.registerBeanDefinition("ip", new RootBeanDefinition(FactoryResultInjectionPoint.class));
RootBeanDefinition bd3 = new RootBeanDefinition(FactoryBeanInjectionPoints.class);
bd3.setScope(RootBeanDefinition.SCOPE_PROTOTYPE);
context.registerBeanDefinition("ip", bd3);
context.refresh();
assertThat(context.getBean("ip", FactoryResultInjectionPoint.class).factoryResult).isSameAs(context.getBean("fb1"));
assertThat(context.getBean("ip", FactoryResultInjectionPoint.class).factoryResult).isSameAs(context.getBean("fb1"));
assertThat(context.getType("&fb1")).isEqualTo(GenericHolderFactoryBean.class);
assertThat(context.getType("fb1")).isEqualTo(GenericHolder.class);
assertThat(context.getBeanNamesForType(FactoryBean.class)).hasSize(2);
assertThat(context.getBean("ip", FactoryResultInjectionPoint.class).factoryResult).isSameAs(context.getBean("fb1"));
assertThat(context.getBeanNamesForType(FactoryBean.class)).hasSize(2);
assertThat(context.getBeanProvider(ResolvableType.forClassWithGenerics(GenericHolder.class, String.class)))
.containsOnly(context.getBean("fb1"));
}
@Test
@@ -453,14 +461,19 @@ class AnnotationConfigApplicationContextTests {
bd2.setBeanClass(UntypedFactoryBean.class);
bd2.setTargetType(ResolvableType.forClassWithGenerics(GenericHolder.class, Integer.class));
context.registerBeanDefinition("fb2", bd2);
context.registerBeanDefinition("ip", new RootBeanDefinition(FactoryResultInjectionPoint.class));
RootBeanDefinition bd3 = new RootBeanDefinition(FactoryResultInjectionPoint.class);
bd3.setScope(RootBeanDefinition.SCOPE_PROTOTYPE);
context.registerBeanDefinition("ip", bd3);
context.refresh();
assertThat(context.getBean("ip", FactoryResultInjectionPoint.class).factoryResult).isSameAs(context.getBean("fb1"));
assertThat(context.getBean("ip", FactoryResultInjectionPoint.class).factoryResult).isSameAs(context.getBean("fb1"));
assertThat(context.getType("&fb1")).isEqualTo(GenericHolderFactoryBean.class);
assertThat(context.getType("fb1")).isEqualTo(GenericHolder.class);
assertThat(context.getBeanNamesForType(FactoryBean.class)).hasSize(2);
assertThat(context.getBeanNamesForType(GenericHolderFactoryBean.class)).hasSize(1);
assertThat(context.getBean("ip", FactoryResultInjectionPoint.class).factoryResult).isSameAs(context.getBean("fb1"));
assertThat(context.getBeanProvider(ResolvableType.forClassWithGenerics(GenericHolder.class, String.class)))
.containsOnly(context.getBean("fb1"));
}
@Test
@@ -480,6 +493,9 @@ class AnnotationConfigApplicationContextTests {
assertThat(context.getType("fb")).isEqualTo(String.class);
assertThat(context.getBeanNamesForType(FactoryBean.class)).hasSize(1);
assertThat(context.getBeanNamesForType(TypedFactoryBean.class)).hasSize(1);
assertThat(context.getBeanProvider(String.class)).containsOnly(context.getBean("fb", String.class));
assertThat(context.getBeanProvider(ResolvableType.forClassWithGenerics(FactoryBean.class, String.class)))
.containsOnly(context.getBean("&fb"));
}
@Test

View File

@@ -18,7 +18,6 @@ package org.springframework.context.annotation;
import java.util.List;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.beans.BeanUtils;
@@ -67,8 +66,7 @@ public class Gh32489Tests {
}
@Test
@Disabled
void resolveFactoryBeanWithMatchingGeneric() {
void provideFactoryBeanWithMatchingGenerics() {
try (AnnotationConfigApplicationContext context = prepareContext()) {
context.refresh();
ResolvableType requiredType = ResolvableType.forClassWithGenerics(SimpleRepositoryFactoryBean.class,
@@ -78,7 +76,7 @@ public class Gh32489Tests {
}
@Test
void resolveFactoryBeanWithFirstNonMatchingGeneric() {
void provideFactoryBeanWithFirstNonMatchingGenerics() {
try (AnnotationConfigApplicationContext context = prepareContext()) {
context.refresh();
ResolvableType requiredType = ResolvableType.forClassWithGenerics(SimpleRepositoryFactoryBean.class,
@@ -88,7 +86,7 @@ public class Gh32489Tests {
}
@Test
void resolveFactoryBeanWithSecondNonMatchingGeneric() {
void provideFactoryBeanWithSecondNonMatchingGenerics() {
try (AnnotationConfigApplicationContext context = prepareContext()) {
context.refresh();
ResolvableType requiredType = ResolvableType.forClassWithGenerics(SimpleRepositoryFactoryBean.class,
@@ -98,7 +96,7 @@ public class Gh32489Tests {
}
@Test
void resolveFactoryBeanTargetTypeWithMatchingGeneric() {
void provideFactoryBeanTargetTypeWithMatchingGenerics() {
try (AnnotationConfigApplicationContext context = prepareContext()) {
context.refresh();
ResolvableType requiredType = ResolvableType.forClassWithGenerics(Repository.class,
@@ -109,7 +107,7 @@ public class Gh32489Tests {
}
@Test
void resolveFactoryBeanTargetTypeWithFirstNonMatchingGeneric() {
void provideFactoryBeanTargetTypeWithFirstNonMatchingGenerics() {
try (AnnotationConfigApplicationContext context = prepareContext()) {
context.refresh();
ResolvableType requiredType = ResolvableType.forClassWithGenerics(Repository.class,
@@ -119,7 +117,7 @@ public class Gh32489Tests {
}
@Test
void resolveFactoryBeanTargetTypeWithSecondNonMatchingGeneric() {
void provideFactoryBeanTargetTypeWithSecondNonMatchingGenerics() {
try (AnnotationConfigApplicationContext context = prepareContext()) {
context.refresh();
ResolvableType requiredType = ResolvableType.forClassWithGenerics(Repository.class,
@@ -143,21 +141,18 @@ public class Gh32489Tests {
@Autowired
List<SimpleRepositoryFactoryBean<?, ?>> repositoryFactoryies;
}
static class RepositoryFactoriesInformationHolder {
@Autowired
List<RepositoryFactoryInformation<?, ?>> repositoryFactoresInformation;
}
static class RepositoryFactoryHolder {
@Autowired
SimpleRepositoryFactoryBean<EmployeeRepository, Long> repositoryFactory;
}
static class SimpleRepositoryFactoryBean<T, ID> extends RepositoryFactoryBeanSupport<T, ID> {