BeanDefinitionRegistryPostProcessor - 如何将 @Configuration class 注册为 BeanDefinition 并同时注册它的 @Beans
BeanDefinitionRegistryPostProcessor - How to register a @Configuration class as BeanDefinition and get its @Beans registered as well
假设我有这个 @Configuration
class:
@Configuration
public class SomeConfig{
@Bean
public MyBean myBean(){
return new MyBean();
}
@Bean
public Another anotherBean(){
return new AnotherBean();
}
}
我有一个 class 实现 BeanDefinitionRegistryPostProcessor
以添加某些 BeanDefinition
。在它上面我还想导入 SomeConfig
以便将它的 beans 添加到上下文中:
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
BeanDefinition someConfig= new RootBeanDefinition("x.y.z.SomeConfig");
registry.registerBeanDefinition("someConfig", someConfig);
}
问题是 SomeConfig
的 bean (myBean
, anotherBean
) 没有被添加到上下文中。虽然有一个 someConfig bean:
@Autowired
MyBean myBean ---> FAILS
@Autowired
AnotherBean anotherBean ---> FAILS
@Autowired
SomeConfig someConfig ---> OK
它没有导入 @Bean
的原因是 ConfigurationClassPostProcessor
在我的后处理器之前执行,所以没有添加新的 bean。为了解决它,我实施了 PriorityOrdered
:
@Configuration
public class MyFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered{
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
BeanDefinition someConfig= new RootBeanDefinition("x.y.z.SomeConfig");
registry.registerBeanDefinition("someConfig", someConfig);
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
}
同样重要 后处理器 class 是 @Configuration
并且 直接在配置中导入 ,未在另一个 @Configuration
class 中定义,它被定义为 @Bean:
@Configuration
public class BeanDefinitionFactoryTestConfig {
@Bean
public MyFactoryPostProcessor cc(){
return new MyFactoryPostProcessor ();
}
}
-->> THIS WILL FAIL TO IMPORT THE BEANS<<--
假设我有这个 @Configuration
class:
@Configuration
public class SomeConfig{
@Bean
public MyBean myBean(){
return new MyBean();
}
@Bean
public Another anotherBean(){
return new AnotherBean();
}
}
我有一个 class 实现 BeanDefinitionRegistryPostProcessor
以添加某些 BeanDefinition
。在它上面我还想导入 SomeConfig
以便将它的 beans 添加到上下文中:
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
BeanDefinition someConfig= new RootBeanDefinition("x.y.z.SomeConfig");
registry.registerBeanDefinition("someConfig", someConfig);
}
问题是 SomeConfig
的 bean (myBean
, anotherBean
) 没有被添加到上下文中。虽然有一个 someConfig bean:
@Autowired
MyBean myBean ---> FAILS
@Autowired
AnotherBean anotherBean ---> FAILS
@Autowired
SomeConfig someConfig ---> OK
它没有导入 @Bean
的原因是 ConfigurationClassPostProcessor
在我的后处理器之前执行,所以没有添加新的 bean。为了解决它,我实施了 PriorityOrdered
:
@Configuration
public class MyFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered{
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
BeanDefinition someConfig= new RootBeanDefinition("x.y.z.SomeConfig");
registry.registerBeanDefinition("someConfig", someConfig);
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
}
同样重要 后处理器 class 是 @Configuration
并且 直接在配置中导入 ,未在另一个 @Configuration
class 中定义,它被定义为 @Bean:
@Configuration
public class BeanDefinitionFactoryTestConfig {
@Bean
public MyFactoryPostProcessor cc(){
return new MyFactoryPostProcessor ();
}
}
-->> THIS WILL FAIL TO IMPORT THE BEANS<<--