diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassEnhancer.java b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassEnhancer.java index 6d41d8918bc..294d765c1c3 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassEnhancer.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassEnhancer.java @@ -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; 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 d194ede6f9a..b5d75c8fb07 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 @@ -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 { 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 { } } + @Configuration + static abstract class BeanLookupConfiguration { + + @Bean + public TestBean thing() { + return new TestBean(); + } + + @Lookup + public abstract TestBean getTestBean(); + } + }