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<<--