@DependsOn 注解
({"systemConfigService"})public class BizService {public BizService() {String xxValue = SystemConfigService.getSystemConfig("xxKey");// 可行}}
最终答案
# 注册 ApplicationContextInitializerorg.springframework.context.ApplicationContextInitializer=com.antbank.demo.bootstrap.MyApplicationContextInitializer
注册 ApplicationContextInitializer 的目的其实是为了接下来注册 BeanDefinitionRegistryPostProcessor 到 Spring 中,我没有找到直接使用 spring.factories 来注册 BeanDefinitionRegistryPostProcessor 的方式,猜测是不支持的:
public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {public void initialize(ConfigurableApplicationContext applicationContext) {// 注意,如果你同时还使用了 spring cloud,这里需要做个判断,要不要在 spring cloud applicationContext 中做这个事// 通常 spring cloud 中的 bean 都和业务没关系,是需要跳过的applicationContext.addBeanFactoryPostProcessor(new MyBeanDefinitionRegistryPostProcessor());}}
除了使用 spring 提供的 SPI 来注册 ApplicationContextInitializer,你也可以用 SpringApplication.addInitializers 的方式直接在 main 方法中直接注册一个 ApplicationContextInitializer 结果都是可以的:
public class SpringBootDemoApplication {public static void main(String[] args) {SpringApplication application = new SpringApplication(SpringBootDemoApplication.class);// 通过 SpringApplication 注册 ApplicationContextInitializerapplication.addInitializers(new MyApplicationContextInitializer());application.run(args);}}
当然了,通过 Spring 的事件机制也可以做到注册 BeanDefinitionRegistryPostProcessor,选择实现合适的 ApplicationListener 事件,可以通过 ApplicationContextEvent 获得 ApplicationContext,即可注册 BeanDefinitionRegistryPostProcessor,这里就不多展开了。
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {// 手动注册一个 BeanDefinitionregistry.registerBeanDefinition("systemConfigService", new RootBeanDefinition(SystemConfigService.class));}public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {}}
当然你也可以使用一个类同时实现 ApplicationContextInitializer 和BeanDefinitionRegistryPostProcessor