ApplicationContextInitializer初始的先后顺序: 1.加载META-INF/spring.factories目录下的ApplicationContextInitializer
org.springframework.boot.context.config.DelegatingApplicationContextInitializer#getInitializerClasses
从环境变量里面获取init context.initializer.classes
private List<Class<?>> getInitializerClasses(ConfigurableEnvironment env) { //dk 从环境变量里面获取init String classNames = env.getProperty(PROPERTY_NAME); List<Class<?>> classes = new ArrayList<>(); if (StringUtils.hasLength(classNames)) { for (String className : StringUtils.tokenizeToStringArray(classNames, ",")) { //dk 把环境变量获取到的init加入classes里面 classes.add(getInitializerClass(className)); } } return classes; }
//dk 开始执行换变量里面的init,故顺序第一
org.springframework.boot.context.config.DelegatingApplicationContextInitializer#initialize
@Override public void initialize(ConfigurableApplicationContext context) { ConfigurableEnvironment environment = context.getEnvironment(); List<Class<?>> initializerClasses = getInitializerClasses(environment); if (!initializerClasses.isEmpty()) { applyInitializerClasses(context, initializerClasses); } }
//dk 执行加载META-INF/spring.factories目录下的ApplicationContextInitializer,故顺序第二
org.springframework.boot.SpringApplication#applyInitializers
protected void applyInitializers(ConfigurableApplicationContext context) { for (ApplicationContextInitializer initializer : getInitializers()) { Class<?> requiredType = GenericTypeResolver.resolveTypeArgument(initializer.getClass(), ApplicationContextInitializer.class); Assert.isInstanceOf(requiredType, context, "Unable to call initializer."); initializer.initialize(context); } }
同理ApplicationListener的初始先后顺序:
1.加载META-INF/spring.factories目录下的ApplicationListener,同时会对监听器进行过滤,一定要和监听事件对应,如果没有实现监听器里面的泛型则实现任意事件监听,比如准备事件,启动事件都会监听,
实例中有1和4,4会监听,而1不会监听
org.springframework.context.ApplicationListener=com.mooc.sb2.listenner.FirstListener, com.mooc.sb2.listenner.FourthListener
@Order(1) //注意如果没有泛型的话,则对所有监听器进行监听 public class FirstListener implements ApplicationListener<ApplicationStartedEvent> {
@Order(4) //注意如果没有泛型的话,则对所有监听器进行监听 public class FourthListener implements SmartApplicationListener{
综上所述:
1.init初始化顺序:
1.1 从环境变量里面获取context.initializer.classes
1.2 执行加载META-INF/spring.factories目录下的ApplicationContextInitializer,故顺序第二
2.listen初始化顺序:
2.1 执行加载META-INF/spring.factories目录下listen符合对应的事件,准备事件,启动事件,没有泛型事件都会执行
2.2 从环境变量里面获取context.listener.classes
2.3 实现接口,
@Order(1) //注意如果没有泛型的话,则对所有监听器进行监听 public class FirstListener implements ApplicationListener<ApplicationStartedEvent> {
3.实现ApplicationRunner接口的,实现CommandLineRunner接口的,且ApplicationRunner优先级高于CommandLineRunner
到此整个springboot的生命周期结束