From 0088922dfd090d1ed77d8b29042072157e9e5658 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 1 Aug 2017 12:05:26 +0200 Subject: [PATCH] checkConfigurationClassCandidate explicitly skips factory method definitions Issue: SPR-14603 (cherry picked from commit 1fbd047) --- .../annotation/ConfigurationClassUtils.java | 4 +-- .../ConfigurationClassPostProcessorTests.java | 36 +++++++++++++++---- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassUtils.java b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassUtils.java index d5f71a9fa01..98c4cb62f00 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassUtils.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -79,7 +79,7 @@ abstract class ConfigurationClassUtils { */ public static boolean checkConfigurationClassCandidate(BeanDefinition beanDef, MetadataReaderFactory metadataReaderFactory) { String className = beanDef.getBeanClassName(); - if (className == null) { + if (className == null || beanDef.getFactoryMethodName() != null) { return false; } diff --git a/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java b/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java index def4d133ac4..3d6f8c8e956 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java +++ b/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java @@ -43,6 +43,9 @@ import org.springframework.beans.factory.annotation.Lookup; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.QualifierAnnotationAutowireCandidateResolver; 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.DefaultListableBeanFactory; import org.springframework.beans.factory.support.RootBeanDefinition; @@ -794,6 +797,12 @@ public class ConfigurationClassPostProcessorTests { ctx.getBean("myTestBean", TestBean.class); } + @Test + public void testBeanDefinitionRegistryPostProcessorConfig() { + ApplicationContext ctx = new AnnotationConfigApplicationContext(BeanDefinitionRegistryPostProcessorConfig.class); + assertTrue(ctx.getBean("myTestBean") instanceof TestBean); + } + // ------------------------------------------------------------------------- @@ -860,8 +869,7 @@ public class ConfigurationClassPostProcessorTests { @Configuration static class UnloadedConfig { - public @Bean - Foo foo() { + public @Bean Foo foo() { return new Foo(); } } @@ -869,8 +877,7 @@ public class ConfigurationClassPostProcessorTests { @Configuration static class LoadedConfig { - public @Bean - Bar bar() { + public @Bean Bar bar() { return new Bar(new Foo()); } } @@ -884,9 +891,7 @@ public class ConfigurationClassPostProcessorTests { @Configuration public static class ScopedProxyConfigurationClass { - @Bean - @Lazy - @Scope(proxyMode = ScopedProxyMode.INTERFACES) + @Bean @Lazy @Scope(proxyMode = ScopedProxyMode.INTERFACES) public ITestBean scopedClass() { return new TestBean(); } @@ -1475,4 +1480,21 @@ public class ConfigurationClassPostProcessorTests { 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) { + } + }; + } + } + }