BeanDefinitionRegistryPostProcessor - Как зарегистрировать класс @Configuration как BeanDefinition и также зарегистрировать его @Beans

Предположим, у меня есть этот @Configuration класс:

@Configuration
public class SomeConfig{

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

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

У меня есть класс, который реализует 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 (myBean, anotherBean) не были добавлены в контекст. Однако есть bean-компонент someConfig:

@Autowired
MyBean myBean   ---> FAILS

@Autowired
AnotherBean anotherBean   ---> FAILS

@Autowired
SomeConfig someConfig   ---> OK

person codependent    schedule 03.01.2017    source источник


Ответы (1)


Причина, по которой он не импортировал @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;
    }
}

Также важно, чтобы класс постпроцессора был @Configuration и импортировался непосредственно в конфигурацию, а не был определен в другом @Configuration классе с его определением как @Bean:

@Configuration
public class BeanDefinitionFactoryTestConfig {

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

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

person codependent    schedule 03.01.2017
comment
привет, я следую этому ответу и использую PriorityOrdered, но я все еще не могу определить beans в классе конфигурации @Configuration, не могли бы вы показать мне полный код? Большое спасибо! - person rellocs wood; 19.10.2017
comment
Где это упоминается в весенней документации? - person Prashant Kalkar; 17.04.2018
comment
Я пробовал несколько подходов для этого, также попробовал BeanDefinitionRegistryPostProcessor, но смог заставить его работать, потому что я создавал из него @Bean. Большое спасибо за этот ответ. Ты только что спас мне день. - person Sanjay Rawat; 16.04.2020