Lookup methods work on configuration classes as well
Issue: SPR-15316
This commit is contained in:
parent
8b741508a6
commit
fc2e635c05
|
|
@ -270,13 +270,13 @@ class ConfigurationClassEnhancer {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
|
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");
|
Assert.state(field != null, "Unable to find generated BeanFactory field");
|
||||||
field.set(obj, args[0]);
|
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 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 proxy.invokeSuper(obj, args);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@ import org.springframework.beans.factory.FactoryBean;
|
||||||
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
|
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.Qualifier;
|
||||||
import org.springframework.beans.factory.annotation.QualifierAnnotationAutowireCandidateResolver;
|
import org.springframework.beans.factory.annotation.QualifierAnnotationAutowireCandidateResolver;
|
||||||
import org.springframework.beans.factory.config.BeanDefinitionHolder;
|
import org.springframework.beans.factory.config.BeanDefinitionHolder;
|
||||||
|
|
@ -779,6 +780,14 @@ public class ConfigurationClassPostProcessorTests {
|
||||||
assertSame(ctx.getBean(TestBean.class), bean.testBeans.get(0));
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue