checkConfigurationClassCandidate explicitly skips factory method definitions

Issue: SPR-14603
This commit is contained in:
Juergen Hoeller 2017-08-01 12:05:26 +02:00
parent f813a63fd8
commit 1fbd047003
2 changed files with 30 additions and 8 deletions

View File

@ -79,7 +79,7 @@ abstract class ConfigurationClassUtils {
*/ */
public static boolean checkConfigurationClassCandidate(BeanDefinition beanDef, MetadataReaderFactory metadataReaderFactory) { public static boolean checkConfigurationClassCandidate(BeanDefinition beanDef, MetadataReaderFactory metadataReaderFactory) {
String className = beanDef.getBeanClassName(); String className = beanDef.getBeanClassName();
if (className == null) { if (className == null || beanDef.getFactoryMethodName() != null) {
return false; return false;
} }

View File

@ -43,6 +43,9 @@ import org.springframework.beans.factory.annotation.Lookup;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.QualifierAnnotationAutowireCandidateResolver; import org.springframework.beans.factory.annotation.QualifierAnnotationAutowireCandidateResolver;
import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.ChildBeanDefinition; import org.springframework.beans.factory.support.ChildBeanDefinition;
import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.support.RootBeanDefinition;
@ -806,6 +809,12 @@ public class ConfigurationClassPostProcessorTests {
ctx.getBean("myTestBean", TestBean.class); ctx.getBean("myTestBean", TestBean.class);
} }
@Test
public void testBeanDefinitionRegistryPostProcessorConfig() {
ApplicationContext ctx = new AnnotationConfigApplicationContext(BeanDefinitionRegistryPostProcessorConfig.class);
assertTrue(ctx.getBean("myTestBean") instanceof TestBean);
}
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
@ -902,8 +911,7 @@ public class ConfigurationClassPostProcessorTests {
@Configuration @Configuration
static class UnloadedConfig { static class UnloadedConfig {
public @Bean public @Bean Foo foo() {
Foo foo() {
return new Foo(); return new Foo();
} }
} }
@ -911,8 +919,7 @@ public class ConfigurationClassPostProcessorTests {
@Configuration @Configuration
static class LoadedConfig { static class LoadedConfig {
public @Bean public @Bean Bar bar() {
Bar bar() {
return new Bar(new Foo()); return new Bar(new Foo());
} }
} }
@ -926,9 +933,7 @@ public class ConfigurationClassPostProcessorTests {
@Configuration @Configuration
public static class ScopedProxyConfigurationClass { public static class ScopedProxyConfigurationClass {
@Bean @Bean @Lazy @Scope(proxyMode = ScopedProxyMode.INTERFACES)
@Lazy
@Scope(proxyMode = ScopedProxyMode.INTERFACES)
public ITestBean scopedClass() { public ITestBean scopedClass() {
return new TestBean(); return new TestBean();
} }
@ -1517,4 +1522,21 @@ public class ConfigurationClassPostProcessorTests {
public abstract TestBean getTestBean(); public abstract TestBean getTestBean();
} }
@Configuration
static class BeanDefinitionRegistryPostProcessorConfig {
@Bean
public static BeanDefinitionRegistryPostProcessor bdrpp() {
return new BeanDefinitionRegistryPostProcessor() {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
registry.registerBeanDefinition("myTestBean", new RootBeanDefinition(TestBean.class));
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
}
};
}
}
} }