2017-01-03 89 views
1

讓我們假設我有這個@Configuration類:BeanDefinitionRegistryPostProcessor - 如何註冊@Configuration類作爲的BeanDefinition並獲取其@Beans註冊以及

@Configuration 
public class SomeConfig{ 

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

    @Bean 
    public Another anotherBean(){ 
     return new AnotherBean(); 
    } 
} 

我有一個實現BeanDefinitionRegistryPostProcessor添加某些BeanDefinition個類。在這我也想進口SomeConfig使其豆被添加到上下文:

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

的問題是,SomeConfig的豆類(myBeananotherBean)還沒有被添加到背景。有一個someConfig豆雖:

@Autowired 
MyBean myBean ---> FAILS 

@Autowired 
AnotherBean anotherBean ---> FAILS 

@Autowired 
SomeConfig someConfig ---> OK 

回答

2

有原因,它沒有導入@Bean S爲使不添加新豆是ConfigurationClassPostProcessor是我的後處理之前執行。爲了解決這個問題,我實現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", enableOAuth2ClientBd); 
    } 

    @Override 
    public int getOrder() { 
     return Ordered.HIGHEST_PRECEDENCE; 
    } 
} 

這也是重要的後處理器類是@Configuration,並直接在配置進口,在另一@Configuration類與它沒有定義界定爲@Bean:

@Configuration 
public class BeanDefinitionFactoryTestConfig { 

    @Bean 
    public MyFactoryPostProcessor cc(){ 
     return new MyFactoryPostProcessor(); 
    } 
} 

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

+0

嗨,我跟隨這個答案並使用'PriorityOrdered',但是我仍然無法獲得在@Configuration config類中定義的bean,請向我展示完整的代碼嗎?非常感謝! –