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 8b1f84cbf4b..5a1a1186f3f 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 @@ -356,10 +356,10 @@ class ConfigurationClassEnhancer { return cglibMethodProxy.invokeSuper(enhancedConfigInstance, beanMethodArgs); } else { - // The user (i.e. not the factory) is requesting this bean through a - // call to the bean method, direct or indirect. The bean may have already been - // marked as 'in creation' in certain autowiring scenarios; if so, temporarily - // set the in-creation status to false in order to avoid an exception. + // The user (i.e. not the factory) is requesting this bean through a call to + // the bean method, direct or indirect. The bean may have already been marked + // as 'in creation' in certain autowiring scenarios; if so, temporarily set + // the in-creation status to false in order to avoid an exception. boolean alreadyInCreation = beanFactory.isCurrentlyInCreation(beanName); try { if (alreadyInCreation) { @@ -393,6 +393,11 @@ class ConfigurationClassEnhancer { } throw new IllegalStateException(msg); } + Method currentlyInvoked = SimpleInstantiationStrategy.getCurrentlyInvokedFactoryMethod(); + if (currentlyInvoked != null) { + String outerBeanName = BeanAnnotationHelper.determineBeanNameFor(currentlyInvoked); + beanFactory.registerDependentBean(beanName, outerBeanName); + } return beanInstance; } finally { 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 85e888672cc..25da88cf3fb 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 @@ -20,6 +20,7 @@ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import java.util.Arrays; import java.util.List; import javax.annotation.PostConstruct; @@ -94,6 +95,7 @@ public class ConfigurationClassPostProcessorTests { Foo foo = beanFactory.getBean("foo", Foo.class); Bar bar = beanFactory.getBean("bar", Bar.class); assertSame(foo, bar.foo); + assertTrue(Arrays.asList(beanFactory.getDependentBeans("foo")).contains("bar")); } @Test