Fixed SPR-5655 - dm Server issues with ConfigurationClassPostProcessor attempting to read .class files with ASM with incorrect class loader
This commit is contained in:
parent
b14d760c9b
commit
254bf7e403
|
|
@ -26,9 +26,11 @@ import org.springframework.beans.BeansException;
|
|||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
|
||||
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
|
||||
import org.springframework.beans.factory.support.AbstractBeanDefinition;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
||||
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
|
||||
import org.springframework.core.Ordered;
|
||||
import org.springframework.core.annotation.AnnotationUtils;
|
||||
import org.springframework.core.type.AnnotationMetadata;
|
||||
import org.springframework.core.type.ClassMetadata;
|
||||
import org.springframework.core.type.classreading.MetadataReader;
|
||||
|
|
@ -122,7 +124,7 @@ public class ConfigurationClassPostProcessor extends AbstractConfigurationClassP
|
|||
if (beanDef.isAbstract() && !includeAbstractBeanDefs)
|
||||
continue;
|
||||
|
||||
if (isConfigurationClassBeanDefinition(beanDef))
|
||||
if (isConfigurationClassBeanDefinition(beanDef, beanFactory.getBeanClassLoader()))
|
||||
configBeanDefs.registerBeanDefinition(beanName, beanDef);
|
||||
}
|
||||
|
||||
|
|
@ -181,14 +183,20 @@ public class ConfigurationClassPostProcessor extends AbstractConfigurationClassP
|
|||
* @return whether the BeanDefinition's beanClass (or its ancestry) is
|
||||
* {@link Configuration}-annotated, false if no beanClass is specified.
|
||||
*/
|
||||
private static boolean isConfigurationClassBeanDefinition(BeanDefinition beanDef) {
|
||||
private static boolean isConfigurationClassBeanDefinition(BeanDefinition beanDef, ClassLoader classLoader) {
|
||||
|
||||
// accommodating SPR-5655
|
||||
Assert.isInstanceOf(AbstractBeanDefinition.class, beanDef);
|
||||
if(((AbstractBeanDefinition) beanDef).hasBeanClass())
|
||||
return AnnotationUtils.findAnnotation(
|
||||
((AbstractBeanDefinition)beanDef).getBeanClass(), Configuration.class) != null;
|
||||
|
||||
String className = beanDef.getBeanClassName();
|
||||
|
||||
while (className != null && !(className.equals(Object.class.getName()))) {
|
||||
try {
|
||||
MetadataReader metadataReader =
|
||||
new SimpleMetadataReaderFactory().getMetadataReader(className);
|
||||
new SimpleMetadataReaderFactory(classLoader).getMetadataReader(className);
|
||||
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
|
||||
ClassMetadata classMetadata = metadataReader.getClassMetadata();
|
||||
|
||||
|
|
|
|||
|
|
@ -143,5 +143,34 @@ public class ConfigurationPostProcessorTests {
|
|||
final Foo foo;
|
||||
public Bar(Foo foo) { this.foo = foo; }
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Tests the fix for SPR-5655, a special workaround that prefers reflection
|
||||
* over ASM if a bean class is already loaded.
|
||||
*/
|
||||
@Test
|
||||
public void testAlreadyLoadedConfigurationClasses() {
|
||||
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
|
||||
beanFactory.registerBeanDefinition("unloadedConfig",
|
||||
rootBeanDefinition(UnloadedConfig.class.getName()).getBeanDefinition());
|
||||
beanFactory.registerBeanDefinition("loadedConfig",
|
||||
rootBeanDefinition(LoadedConfig.class).getBeanDefinition());
|
||||
new ConfigurationClassPostProcessor() .postProcessBeanFactory(beanFactory);
|
||||
beanFactory.getBean("foo");
|
||||
beanFactory.getBean("bar");
|
||||
}
|
||||
|
||||
@Configuration
|
||||
static class UnloadedConfig {
|
||||
public @Bean Foo foo() {
|
||||
return new Foo();
|
||||
}
|
||||
}
|
||||
|
||||
@Configuration
|
||||
static class LoadedConfig {
|
||||
public @Bean Bar bar() {
|
||||
return new Bar(new Foo());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue