BeanDefinitionRegistryPostProcessor - 如何将@Configuration 类注册为 BeanDefinition 并使其@Beans 也注册

cod*_*ent 6 java spring spring-mvc spring-bean

假设我有这@Configuration门课:

@Configuration
public class SomeConfig{

    @Bean
    public MyBean myBean(){
         return new MyBean();
    } 

    @Bean
    public Another anotherBean(){
         return new AnotherBean();
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个实现BeanDefinitionRegistryPostProcessor添加某些BeanDefinitions 的类。我还想导入它,SomeConfig以便将其 bean 添加到上下文中:

@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
    BeanDefinition someConfig= new RootBeanDefinition("x.y.z.SomeConfig");
    registry.registerBeanDefinition("someConfig", someConfig);
}
Run Code Online (Sandbox Code Playgroud)

问题是SomeConfig's beans ( myBean, anotherBean) 尚未添加到上下文中。虽然有一个 someConfig bean:

@Autowired
MyBean myBean   ---> FAILS

@Autowired
AnotherBean anotherBean   ---> FAILS

@Autowired
SomeConfig someConfig   ---> OK
Run Code Online (Sandbox Code Playgroud)

cod*_*ent 7

它没有导入@Beans 的原因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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这也是很重要的是,后处理类@Configuration,并直接在配置进口,在另一个没有定义@Configuration的类与它定义为@Bean:

@Configuration
public class BeanDefinitionFactoryTestConfig {

    @Bean
    public MyFactoryPostProcessor cc(){
        return new MyFactoryPostProcessor ();
    }   
}
Run Code Online (Sandbox Code Playgroud)

-->> THIS WILL FAIL TO IMPORT THE BEANS<<--