自定义初始化器实现
实现 ApplicationContextInitializer接口
@Order(1)
public class FirstInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
ConfigurableEnvironment environment = applicationContext.getEnvironment();
Map<String, Object> map = new HashMap<>();
map.put("key1", "first");
MapPropertySource mapPropertySource = new MapPropertySource("firstInitializer", map);
environment.getPropertySources().addLast(mapPropertySource);
System.out.println("run FirstInitializer");
}
}
加载到springboot中
META-INF文件夹下spring.factories内填写接口实现(FirstInitializer)
- 在resources下新建META-INF文件夹,新建spring.factories中定义,key为:org.springframework.context.ApplicationContextInitializer
org.springframework.context.ApplicationContextInitializer=com.demo.silly.spring.boot.initializer.FirstInitializer
通过SpringApplication类初始化后设置进去(SecondInitializer)
@SpringBootApplication
public class SpringBootDemoApplication {
public static void main(String[] args) {
// SpringApplication.run(SpringBootDemoApplication.class, args);
SpringApplication springApplication = new SpringApplication((SpringBootDemoApplication.class));
springApplication.addInitializers(new SecondInitializer());
springApplication.run(args);
}
}
在application.yml种配置(ThreeInitializer)
- application.properties 内填写接口实现,key为:context.initializer.classes
context:
initializer:
classes: com.demo.silly.spring.boot.initializer.ThreeInitializer
获取参数方式
-
代码获取
@Component public class SpringUtils implements ApplicationContextAware { private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } /** * 获取属性 * * @param key * @return */ public String get(String key) { return applicationContext.getEnvironment().getProperty(key); } }
-
属性值获取
@Value("${key1}") private String key1;
顺序结果
run ThreeInitializer
run FirstInitializer
run SecondInitializer
由执行打印的顺序可以得出:
- application.properties > META-INF下spring.factories > SpringApplication类初始化后设置
- Order值越小越先执行