Browse Source

Lookup methods work on configuration classes as well

Issue: SPR-15316
pull/1352/head
Juergen Hoeller 9 years ago
parent
commit
fc2e635c05
  1. 6
      spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassEnhancer.java
  2. 21
      spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java

6
spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassEnhancer.java

@ -270,13 +270,13 @@ class ConfigurationClassEnhancer { @@ -270,13 +270,13 @@ class ConfigurationClassEnhancer {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
Field field = obj.getClass().getDeclaredField(BEAN_FACTORY_FIELD);
Field field = ReflectionUtils.findField(obj.getClass(), BEAN_FACTORY_FIELD);
Assert.state(field != null, "Unable to find generated BeanFactory field");
field.set(obj, args[0]);
// Does the actual (non-CGLIB) superclass actually implement BeanFactoryAware?
// Does the actual (non-CGLIB) superclass implement BeanFactoryAware?
// If so, call its setBeanFactory() method. If not, just exit.
if (BeanFactoryAware.class.isAssignableFrom(obj.getClass().getSuperclass())) {
if (BeanFactoryAware.class.isAssignableFrom(ClassUtils.getUserClass(obj.getClass().getSuperclass()))) {
return proxy.invokeSuper(obj, args);
}
return null;

21
spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java

@ -39,6 +39,7 @@ import org.springframework.beans.factory.FactoryBean; @@ -39,6 +39,7 @@ import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
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;
@ -779,6 +780,14 @@ public class ConfigurationClassPostProcessorTests { @@ -779,6 +780,14 @@ public class ConfigurationClassPostProcessorTests {
assertSame(ctx.getBean(TestBean.class), bean.testBeans.get(0));
}
@Test
public void testBeanLookupFromSameConfigurationClass() {
ApplicationContext ctx = new AnnotationConfigApplicationContext(BeanLookupConfiguration.class);
BeanLookupConfiguration bean = ctx.getBean(BeanLookupConfiguration.class);
assertNotNull(bean.getTestBean());
assertSame(ctx.getBean(TestBean.class), bean.getTestBean());
}
// -------------------------------------------------------------------------
@ -1448,4 +1457,16 @@ public class ConfigurationClassPostProcessorTests { @@ -1448,4 +1457,16 @@ public class ConfigurationClassPostProcessorTests {
}
}
@Configuration
static abstract class BeanLookupConfiguration {
@Bean
public TestBean thing() {
return new TestBean();
}
@Lookup
public abstract TestBean getTestBean();
}
}

Loading…
Cancel
Save