IN PROGRESS - issue SPR-6779: imported @Configuration classes do not get enhanced and fail to satisfy scoping requirements
All tests in ImportedConfigurationClassEnhancementTests now pass. The fix was simple - imported @Configuration class bean definitions were not getting marked with the attribute that indicates that they are indeed @Configuration class bean definitions. To make this happen, ConfigurationClassPostProcessor's protected checkConfigurationClassCandidate(beanDef) method is being called from within ConfigurationClassBeanDefinitionReader when imported @Configuration classes are being processed. This is quick and dirty, and the subsequent check-in will refactor the solution appropriately.
This commit is contained in:
parent
5fdee47841
commit
110b032ad9
|
@ -106,6 +106,7 @@ class ConfigurationClassBeanDefinitionReader {
|
||||||
if (configClass.getBeanName() == null) {
|
if (configClass.getBeanName() == null) {
|
||||||
GenericBeanDefinition configBeanDef = new GenericBeanDefinition();
|
GenericBeanDefinition configBeanDef = new GenericBeanDefinition();
|
||||||
configBeanDef.setBeanClassName(configClass.getMetadata().getClassName());
|
configBeanDef.setBeanClassName(configClass.getMetadata().getClassName());
|
||||||
|
new ConfigurationClassPostProcessor().checkConfigurationClassCandidate(configBeanDef);
|
||||||
String configBeanName = BeanDefinitionReaderUtils.registerWithGeneratedName(configBeanDef, this.registry);
|
String configBeanName = BeanDefinitionReaderUtils.registerWithGeneratedName(configBeanDef, this.registry);
|
||||||
configClass.setBeanName(configBeanName);
|
configClass.setBeanName(configBeanName);
|
||||||
if (logger.isDebugEnabled()) {
|
if (logger.isDebugEnabled()) {
|
||||||
|
|
|
@ -90,8 +90,8 @@ class ConfigurationClassEnhancer {
|
||||||
logger.debug("Enhancing " + configClass.getName());
|
logger.debug("Enhancing " + configClass.getName());
|
||||||
}
|
}
|
||||||
Class<?> enhancedClass = createClass(newEnhancer(configClass));
|
Class<?> enhancedClass = createClass(newEnhancer(configClass));
|
||||||
if (logger.isInfoEnabled()) {
|
if (logger.isDebugEnabled()) {
|
||||||
logger.info(String.format("Successfully enhanced %s; enhanced class name is: %s",
|
logger.debug(String.format("Successfully enhanced %s; enhanced class name is: %s",
|
||||||
configClass.getName(), enhancedClass.getName()));
|
configClass.getName(), enhancedClass.getName()));
|
||||||
}
|
}
|
||||||
return enhancedClass;
|
return enhancedClass;
|
||||||
|
|
|
@ -4,7 +4,6 @@ import static org.hamcrest.CoreMatchers.sameInstance;
|
||||||
import static org.junit.Assert.assertThat;
|
import static org.junit.Assert.assertThat;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
import org.junit.Ignore;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.springframework.aop.support.AopUtils;
|
import org.springframework.aop.support.AopUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
@ -24,9 +23,9 @@ import test.beans.TestBean;
|
||||||
public class ImportedConfigurationClassEnhancementTests {
|
public class ImportedConfigurationClassEnhancementTests {
|
||||||
|
|
||||||
|
|
||||||
@Ignore @Test
|
@Test
|
||||||
public void autowiredConfigClassIsEnhancedWhenImported() {
|
public void autowiredConfigClassIsEnhancedWhenImported() {
|
||||||
autowiredConfigClassIsEnhanced(ConfigThatImports.class);
|
autowiredConfigClassIsEnhanced(ConfigThatDoesImport.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -37,13 +36,14 @@ public class ImportedConfigurationClassEnhancementTests {
|
||||||
private void autowiredConfigClassIsEnhanced(Class<?>... configClasses) {
|
private void autowiredConfigClassIsEnhanced(Class<?>... configClasses) {
|
||||||
ApplicationContext ctx = new AnnotationConfigApplicationContext(configClasses);
|
ApplicationContext ctx = new AnnotationConfigApplicationContext(configClasses);
|
||||||
Config config = ctx.getBean(Config.class);
|
Config config = ctx.getBean(Config.class);
|
||||||
assertTrue(AopUtils.isCglibProxyClass(config.autowiredConfig.getClass()));
|
assertTrue("autowired config class has not been enhanced",
|
||||||
|
AopUtils.isCglibProxyClass(config.autowiredConfig.getClass()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Ignore @Test
|
@Test
|
||||||
public void autowiredConfigClassBeanMethodsRespectScopingWhenImported() {
|
public void autowiredConfigClassBeanMethodsRespectScopingWhenImported() {
|
||||||
autowiredConfigClassBeanMethodsRespectScoping(ConfigThatImports.class);
|
autowiredConfigClassBeanMethodsRespectScoping(ConfigThatDoesImport.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -56,7 +56,8 @@ public class ImportedConfigurationClassEnhancementTests {
|
||||||
Config config = ctx.getBean(Config.class);
|
Config config = ctx.getBean(Config.class);
|
||||||
TestBean testBean1 = config.autowiredConfig.testBean();
|
TestBean testBean1 = config.autowiredConfig.testBean();
|
||||||
TestBean testBean2 = config.autowiredConfig.testBean();
|
TestBean testBean2 = config.autowiredConfig.testBean();
|
||||||
assertThat(testBean1, sameInstance(testBean2));
|
assertThat("got two distinct instances of testBean when singleton scoping was expected",
|
||||||
|
testBean1, sameInstance(testBean2));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -68,14 +69,13 @@ class ConfigToBeAutowired {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class Config {
|
class Config {
|
||||||
@Autowired ConfigToBeAutowired autowiredConfig;
|
@Autowired ConfigToBeAutowired autowiredConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Import(ConfigToBeAutowired.class)
|
@Import(ConfigToBeAutowired.class)
|
||||||
@Configuration
|
@Configuration
|
||||||
class ConfigThatImports extends Config { }
|
class ConfigThatDoesImport extends Config { }
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
class ConfigThatDoesNotImport extends Config { }
|
class ConfigThatDoesNotImport extends Config { }
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
</layout>
|
</layout>
|
||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
<logger name="org.springframework.mapping">
|
<logger name="org.springframework.context">
|
||||||
<level value="debug" />
|
<level value="debug" />
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue