Merge branch '1.2.x'

This commit is contained in:
Andy Wilkinson 2015-04-16 09:43:06 +01:00
commit 92702b4cd4
2 changed files with 59 additions and 12 deletions

View File

@ -54,6 +54,7 @@ import org.springframework.util.StringUtils;
* </ul> * </ul>
* *
* @author Phillip Webb * @author Phillip Webb
* @author Andy Wilkinson
* @since 1.2.0 * @since 1.2.0
*/ */
abstract class BeanTypeRegistry { abstract class BeanTypeRegistry {
@ -115,13 +116,26 @@ abstract class BeanTypeRegistry {
definition.getFactoryMethodName()); definition.getFactoryMethodName());
Class<?> generic = ResolvableType.forMethodReturnType(method) Class<?> generic = ResolvableType.forMethodReturnType(method)
.as(FactoryBean.class).resolveGeneric(); .as(FactoryBean.class).resolveGeneric();
if ((generic == null || generic.equals(Object.class)) if (generic == null || generic.equals(Object.class)) {
&& definition.hasAttribute(FACTORY_BEAN_OBJECT_TYPE)) { generic = determineTypeFromDefinitionAttribute(factoryDefinition);
generic = (Class<?>) definition.getAttribute(FACTORY_BEAN_OBJECT_TYPE);
} }
return generic; return generic;
} }
private Class<?> determineTypeFromDefinitionAttribute(BeanDefinition definition)
throws ClassNotFoundException, LinkageError {
if (definition.hasAttribute(FACTORY_BEAN_OBJECT_TYPE)) {
Object attributeObject = definition.getAttribute(FACTORY_BEAN_OBJECT_TYPE);
if (attributeObject instanceof Class<?>) {
return (Class<?>) attributeObject;
}
else if (attributeObject instanceof String) {
return ClassUtils.forName((String) attributeObject, null);
}
}
return Object.class;
}
private Class<?> getDirectFactoryBeanGeneric( private Class<?> getDirectFactoryBeanGeneric(
ConfigurableListableBeanFactory beanFactory, BeanDefinition definition, ConfigurableListableBeanFactory beanFactory, BeanDefinition definition,
String name) throws ClassNotFoundException, LinkageError { String name) throws ClassNotFoundException, LinkageError {
@ -129,9 +143,8 @@ abstract class BeanTypeRegistry {
beanFactory.getBeanClassLoader()); beanFactory.getBeanClassLoader());
Class<?> generic = ResolvableType.forClass(factoryBeanClass) Class<?> generic = ResolvableType.forClass(factoryBeanClass)
.as(FactoryBean.class).resolveGeneric(); .as(FactoryBean.class).resolveGeneric();
if ((generic == null || generic.equals(Object.class)) if (generic == null || generic.equals(Object.class)) {
&& definition.hasAttribute(FACTORY_BEAN_OBJECT_TYPE)) { generic = determineTypeFromDefinitionAttribute(definition);
generic = (Class<?>) definition.getAttribute(FACTORY_BEAN_OBJECT_TYPE);
} }
return generic; return generic;
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2013 the original author or authors. * Copyright 2012-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -43,6 +43,7 @@ import static org.junit.Assert.assertTrue;
* @author Dave Syer * @author Dave Syer
* @author Phillip Webb * @author Phillip Webb
* @author Jakub Kubrynski * @author Jakub Kubrynski
* @author Andy Wilkinson
*/ */
@SuppressWarnings("resource") @SuppressWarnings("resource")
public class ConditionalOnMissingBeanTests { public class ConditionalOnMissingBeanTests {
@ -157,8 +158,18 @@ public class ConditionalOnMissingBeanTests {
} }
@Test @Test
public void testOnMissingBeanConditionWithNonspecificFactoryBean() { public void testOnMissingBeanConditionWithNonspecificFactoryBeanWithClassAttribute() {
this.context.register(NonspecificFactoryBeanConfiguration.class, this.context.register(NonspecificFactoryBeanClassAttributeConfiguration.class,
ConditionalOnFactoryBean.class,
PropertyPlaceholderAutoConfiguration.class);
this.context.refresh();
assertThat(this.context.getBean(ExampleBean.class).toString(),
equalTo("fromFactory"));
}
@Test
public void testOnMissingBeanConditionWithNonspecificFactoryBeanWithStringAttribute() {
this.context.register(NonspecificFactoryBeanStringAttributeConfiguration.class,
ConditionalOnFactoryBean.class, ConditionalOnFactoryBean.class,
PropertyPlaceholderAutoConfiguration.class); PropertyPlaceholderAutoConfiguration.class);
this.context.refresh(); this.context.refresh();
@ -211,11 +222,11 @@ public class ConditionalOnMissingBeanTests {
} }
@Configuration @Configuration
@Import(NonspecificFactoryBeanRegistrar.class) @Import(NonspecificFactoryBeanClassAttributeRegistrar.class)
protected static class NonspecificFactoryBeanConfiguration { protected static class NonspecificFactoryBeanClassAttributeConfiguration {
} }
protected static class NonspecificFactoryBeanRegistrar implements protected static class NonspecificFactoryBeanClassAttributeRegistrar implements
ImportBeanDefinitionRegistrar { ImportBeanDefinitionRegistrar {
@Override @Override
@ -232,6 +243,29 @@ public class ConditionalOnMissingBeanTests {
} }
@Configuration
@Import(NonspecificFactoryBeanClassAttributeRegistrar.class)
protected static class NonspecificFactoryBeanStringAttributeConfiguration {
}
protected static class NonspecificFactoryBeanStringAttributeRegistrar implements
ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata meta,
BeanDefinitionRegistry registry) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder
.genericBeanDefinition(NonspecificFactoryBean.class);
builder.addConstructorArgValue("foo");
builder.getBeanDefinition()
.setAttribute(OnBeanCondition.FACTORY_BEAN_OBJECT_TYPE,
ExampleBean.class.getName());
registry.registerBeanDefinition("exampleBeanFactoryBean",
builder.getBeanDefinition());
}
}
@Configuration @Configuration
@Import(FactoryBeanRegistrar.class) @Import(FactoryBeanRegistrar.class)
protected static class RegisteredFactoryBeanConfiguration { protected static class RegisteredFactoryBeanConfiguration {