在BeanDefinitionRegistryPostProcessor

时间:2020-04-14 11:46:00

标签: spring spring-boot

下面的

配置B使用BeanDefinitionRegistryPostProcessor动态注册一些Spring bean。但是,我需要访问在B内部自动装配的配置类A。由于BeanDefinitionRegistryPostProcessor的事实,A总是以Null结尾-“将加载所有常规bean定义,但尚未实例化任何bean”。

无论如何,我是否可以强制配置加载,以便在Configuration类B之前实例化A,以便ApplicationsProperties并不总是为空?

A

@ConfigurationProperties(prefix = "ie.test.appname.applications")
@Configuration
@EnableAutoConfiguration
@EnableConfigurationProperties
@RefreshScope
@Data
public class ApplicationProperties {

    private List<Application> applications = new ArrayList<>();

}

B

      @Configuration
        @Import({ ApplicationProperties.class})
        @Log4j
        public class ConfigurationManager {

            @Autowired
            private ApplicationProperties applicationProperties;

@Bean
    public BeanDefinitionRegistryPostProcessor beanPostProcessor(final ConfigurableEnvironment environment) {
        return new BeanDefinitionRegistryPostProcessor() {
            public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException {
            }

            public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanRegistry) throws BeansException {
                doSomething();
            }
        };
    }


        private void doSomething() {
        List<Application> storeNamesList = applicationProperties.getApplications(); // null pointer
           }

具有组件扫描功能的主机

@SpringBootApplication
@EnableAspectJAutoProxy
@EnableScheduling
@EnableAsync
@ComponentScan("ie.test.appname")
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication .class, args);
    }

}

0 个答案:

没有答案