springboot 初始化器核心源码分析-20

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的生命周期结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值