SpringBoot专题学习Part23:SpringBoot的启动原理 运行原理 自动配置原理及监听器的监听顺序

SpringBoot中有四个比较重要的事件回调机制

  • ApplicationContextInitializer
  • SpringApplicationRunListener
  • ApplicationRunner
  • CommandLineRunner

围绕着这四个接口 可了解SpringBoot的启动原理 运行原理 自动配置原理

启动时 调用了SpringApplication类的run()方法

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

一、创建SpringApplication对象:

SpringBoot程序从启动类的main()方法开始 作为入口
创建SpringApplication对象 同时传入args参数 紧接着运行run()方法

在该方法中 给一些属性赋了默认值 然后调用initialize()方法

在该方法中 判断了主配置类的类型并保存 然后会判断当前应用是否为Web应用
然后会进入setInitializers()方法进行赋值 从类路径下找到/META-INF/spring.factories中找所有配置的ApplicationContextInitializer类 保存起来
之后还会从该路径下找所有的ApplicationListener 保存起来

然后从多个配置类中找到有main()方法的 即认为该类是主配置类
因而 运行SpringBoot应用的时候 允许传入多个配置类 允许传入数组格式
至此 SpringApplication对象创建完毕

二、run():

会创建一个空的ConfigurableApplicationContext
然后默认会从类路径下的/META-INF/spring.factories中获取SpringApplicationRunListener
获取完毕之后进入listener.starting() 遍历并启动所有listener的starting()方法
用ApplicationArguments封装args参数
进入准备环境方法 返回ConfigurableEnvironment对象
在准备环境方法中 创建了一个ConfigurableEnvironment类 并配置了环境
创建环境完成后 回调所有SpringApplicationRunListenerenvironmentPrepared()方法 表示环境准备完成了

之后 若不是Web环境 则转换为Web环境
然后 控制台中打印Spring图标
创建ApplicationContext 根据类型创建容器
之后用反射创建出IOC容器 再调用prepareContext()准备上下文环境 将environment保存到IOC容器中
再调用applyInitializer() 获取所有的Initializer 回调之前保存的所有ApplicationContextInitializerinitialize()方法
再回调所有的SpringApplicationRunListenercontextPrepare()方法 注册之前获取的参数和要打印的logo
当prepareContext运行完成之后 回调所有的SpringApplicationRunListenercontextLoaded()方法

调用refreshContext()方法 刷新容器 若为Web应用 还会创建嵌入式的Tomcat 总之 就是扫描 创建 加载所有的组件(配置类 组件 自动配置)
再调用afterRefresh()方法 里面调用callRunners()方法 从IOC容器中获取所有的ApplicationRunner(顺序是先回调)和CommandLineRunner(顺序是后回调)进行回调
最后所有SpringApplicationRunListener回调running()方法
至此 整个SpringBoot应用启动完成 启动完成之后 返回该启动的IOC容器


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值