Skip to content

Commit

Permalink
Add test for pre-resolved target type on RootBeanDefinition
Browse files Browse the repository at this point in the history
  • Loading branch information
jhoeller committed Apr 18, 2024
1 parent 4e20cde commit fec4f9b
Showing 1 changed file with 48 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.ResolvableType;
import org.springframework.core.type.AnnotationMetadata;

import static org.assertj.core.api.Assertions.assertThat;
Expand All @@ -39,8 +41,9 @@
* {@link FactoryBean FactoryBeans} defined in the configuration.
*
* @author Phillip Webb
* @author Juergen Hoeller
*/
class ConfigurationWithFactoryBeanBeanEarlyDeductionTests {
class ConfigurationWithFactoryBeanEarlyDeductionTests {

@Test
void preFreezeDirect() {
Expand Down Expand Up @@ -82,6 +85,16 @@ void postFreezeAttribute() {
assertPostFreeze(AttributeClassConfiguration.class);
}

@Test
void preFreezeTargetType() {
assertPreFreeze(TargetTypeConfiguration.class);
}

@Test
void postFreezeTargetType() {
assertPostFreeze(TargetTypeConfiguration.class);
}

@Test
void preFreezeUnresolvedGenericFactoryBean() {
// Covers the case where a @Configuration is picked up via component scanning
Expand All @@ -105,14 +118,13 @@ void preFreezeUnresolvedGenericFactoryBean() {
}
}


private void assertPostFreeze(Class<?> configurationClass) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
configurationClass);
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(configurationClass);
assertContainsMyBeanName(context);
}

private void assertPreFreeze(Class<?> configurationClass,
BeanFactoryPostProcessor... postProcessors) {
private void assertPreFreeze(Class<?> configurationClass, BeanFactoryPostProcessor... postProcessors) {
NameCollectingBeanFactoryPostProcessor postProcessor = new NameCollectingBeanFactoryPostProcessor();
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
try (context) {
Expand All @@ -132,41 +144,38 @@ private void assertContainsMyBeanName(String[] names) {
assertThat(names).containsExactly("myBean");
}

private static class NameCollectingBeanFactoryPostProcessor
implements BeanFactoryPostProcessor {

private static class NameCollectingBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

private String[] names;

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException {
this.names = beanFactory.getBeanNamesForType(MyBean.class, true, false);
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
ResolvableType typeToMatch = ResolvableType.forClassWithGenerics(MyBean.class, String.class);
this.names = beanFactory.getBeanNamesForType(typeToMatch, true, false);
}

public String[] getNames() {
return this.names;
}

}

@Configuration
static class DirectConfiguration {

@Bean
MyBean myBean() {
return new MyBean();
MyBean<String> myBean() {
return new MyBean<>();
}

}

@Configuration
static class GenericMethodConfiguration {

@Bean
FactoryBean<MyBean> myBean() {
return new TestFactoryBean<>(new MyBean());
FactoryBean<MyBean<String>> myBean() {
return new TestFactoryBean<>(new MyBean<>());
}

}

@Configuration
Expand All @@ -176,13 +185,11 @@ static class GenericClassConfiguration {
MyFactoryBean myBean() {
return new MyFactoryBean();
}

}

@Configuration
@Import(AttributeClassRegistrar.class)
static class AttributeClassConfiguration {

}

static class AttributeClassRegistrar implements ImportBeanDefinitionRegistrar {
Expand All @@ -191,16 +198,32 @@ static class AttributeClassRegistrar implements ImportBeanDefinitionRegistrar {
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
BeanDefinition definition = BeanDefinitionBuilder.genericBeanDefinition(
RawWithAbstractObjectTypeFactoryBean.class).getBeanDefinition();
definition.setAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE, MyBean.class);
definition.setAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE,
ResolvableType.forClassWithGenerics(MyBean.class, String.class));
registry.registerBeanDefinition("myBean", definition);
}
}

@Configuration
@Import(TargetTypeRegistrar.class)
static class TargetTypeConfiguration {
}

static class TargetTypeRegistrar implements ImportBeanDefinitionRegistrar {

@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
RootBeanDefinition definition = new RootBeanDefinition(RawWithAbstractObjectTypeFactoryBean.class);
definition.setTargetType(ResolvableType.forClassWithGenerics(FactoryBean.class,
ResolvableType.forClassWithGenerics(MyBean.class, String.class)));
registry.registerBeanDefinition("myBean", definition);
}
}

abstract static class AbstractMyBean {
}

static class MyBean extends AbstractMyBean {
static class MyBean<T> extends AbstractMyBean {
}

static class TestFactoryBean<T> implements FactoryBean<T> {
Expand All @@ -220,31 +243,26 @@ public T getObject() {
public Class<?> getObjectType() {
return this.instance.getClass();
}

}

static class MyFactoryBean extends TestFactoryBean<MyBean> {
static class MyFactoryBean extends TestFactoryBean<MyBean<String>> {

public MyFactoryBean() {
super(new MyBean());
super(new MyBean<>());
}

}

static class RawWithAbstractObjectTypeFactoryBean implements FactoryBean<Object> {

private final Object object = new MyBean();

@Override
public Object getObject() {
return object;
public Object getObject() throws Exception {
throw new IllegalStateException();
}

@Override
public Class<?> getObjectType() {
return MyBean.class;
}

}

}

0 comments on commit fec4f9b

Please sign in to comment.