[英]Spring @Configuration runtime injection
在我的非Boot Spring 5項目中,我需要手動注冊並初始化一些bean。 之后,我想向上下文添加一個@Configuration
類,該類從外部庫中導入配置:
@Configuration
@Import(ExtLibConfig.class)
public class MyExtLibConfig {
@Bean
public ExtLibBean extLibBean() {
return ExtLibBean.builder().build();
}
}
ExtLibConfig
有許多自己的@ComponentScan
和@Import
,我希望它們都可以自動配置,包括我的ExtLibBean
。
在運行時可以這樣做嗎? 當添加手動注冊的bean時 ,外部庫會掃描ApplicationContext
,而我需要這樣做。
UPD :問題不是關於bean注冊順序的實際問題。 擴展庫在刷新后正在掃描ApplicationContext
,因此此時我需要我的bean在那里
解決方案是實現BeanDefinitionRegistryPostProcessor
public class MyMockBeanDefinitioRegistrynPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
// registry.registerBeanDefinition(mockBeanClass, mockBeanDefinition);...
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// nothing to do
}
然后將其聲明為Bean
:
@Configuration
public class MockBeanConfig {
@Bean
public MyMockBeanDefinitioRegistrynPostProcessor mockBeanDefinitionPp() {
return new MyMockBeanDefinitioRegistrynPostProcessor();
}
}
並將其添加到上下文中:
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(MockBeanConfig.class);
context.register(MyExtLibConfig.class);
context.refresh();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.