Skip to content

Cannot enhance @Configuration bean definition #22992

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -405,13 +405,17 @@ public void enhanceConfigurationClasses(ConfigurableListableBeanFactory beanFact
throw new BeanDefinitionStoreException("Cannot enhance @Configuration bean definition '" +
beanName + "' since it is not stored in an AbstractBeanDefinition subclass");
}
else if (logger.isInfoEnabled() && beanFactory.containsSingleton(beanName)) {
logger.info("Cannot enhance @Configuration bean definition '" + beanName +
"' since its singleton instance has been created too early. The typical cause " +
"is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor " +
"return type: Consider declaring such methods as 'static'.");
else if (beanFactory.containsSingleton(beanName)) {
if (logger.isInfoEnabled()) {
logger.info("Cannot enhance @Configuration bean definition '" + beanName +
"' since its singleton instance has been created too early. The typical cause " +
"is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor " +
"return type: Consider declaring such methods as 'static'.");
}
}
else {
configBeanDefs.put(beanName, (AbstractBeanDefinition) beanDef);
}
configBeanDefs.put(beanName, (AbstractBeanDefinition) beanDef);
}
}
if (configBeanDefs.isEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,8 @@
import org.springframework.aop.scope.ScopedProxyUtils;
import org.springframework.aop.support.AopUtils;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.beans.factory.BeanDefinitionStoreException;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
import org.springframework.beans.factory.annotation.Lookup;
Expand Down Expand Up @@ -1118,6 +1115,16 @@ public void testBeanDefinitionRegistryPostProcessorConfig() {
assertTrue(ctx.getBean("myTestBean") instanceof TestBean);
}

@Test
public void testBeanDefinitionRegistryPostProcessorImplementation() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(PostProcessorConfiguration.class);
ConfigurableListableBeanFactory testBeanFactory = ctx.getBeanFactory();
PostProcessorConfigurationUser user = (PostProcessorConfigurationUser) ctx.getBean("postProcessorConfigurationUser");
assertEquals(user.getClass().getName(),
testBeanFactory.getBeanDefinition("postProcessorConfigurationUser").getBeanClassName());
assertEquals(user.postProcessorConfiguration.getClass().getName(),
testBeanFactory.getBeanDefinition("configurationClassPostProcessorTests.PostProcessorConfiguration").getBeanClassName());
}

// -------------------------------------------------------------------------

Expand Down Expand Up @@ -2005,4 +2012,21 @@ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
}
}

@Configuration
static class PostProcessorConfiguration implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
registry.registerBeanDefinition("postProcessorConfigurationUser", new RootBeanDefinition(PostProcessorConfigurationUser.class));
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
}

static class PostProcessorConfigurationUser {
@Autowired
PostProcessorConfiguration postProcessorConfiguration;

}

}