Springboot启动过程的源码

可能理解有误的可以指出来,仅仅只是源码查看分析,谢谢大家。

原理图:原理图是复制了其他人但是具体是哪个博主的忘记了。

1.SpringApplication 允许run之前的初始化三个步骤。

  (1).通过org.springframework.web.context.ConfigurableWebApplicationContext既定的特征类判断applicationType是属于web还是非web的类型

(2)调用init方法利用SpringFactoryLoader进行加载在META-INF/spring.factories配置org.springframework.context.ApplicationContextInitializer键值对的所有要用的ApplicationContextInitializer

3)调用init方法利用SpringFactoryLoader进行加载在META-INF/spring.factories配置

org.springframework.context.ApplicationListener键值对的所有要用的ApplicationListener

(4)推断Main方法的自定义类。利用执行的栈信息,回溯到启动类的信息含Main方法的。

到这里就初始化完成了,接下来就是执行SpringApplication的run方法了。

2.利用SpringFactoryLoader查找出所有的SpringApplicationRunListener,进行开启监听,调用started方法进行开启。

4.调用所有的Listeners的environmentPrepared方法,进行准备好配置信息。

5.根据SpringApplication的showBanner属性进行判断是否打印Banner信息,作用不大,只是展示作用。

6.创建初始化时判断类型webApplicationType进行创建上下文ApplicationContext。

7.上下文ApplicationContext准备好后,利用SpringFactoryLoader

进行加载在META-INF/spring.factories配置

org.springframework.boot.SpringBootExceptionReporter键值对的所有要用的SpringBootExceptionReporter(异常分析工具)类,用于后续进行分析发音错误日志。

8.调用prepareContext,(1)先进行根据环境判断是否使用beanNameGenerator,和判断是否使用默认还是自定义的的resourceLoader,(2)接着调用所有的initializer的initialize进行对创建好的ApplicationContext进行进一步设置,(3)设置完毕后进行,遍历所有的Listeners的contextPrepared,告诉Listener已经准备好ApplicationContext文件了,并调用contextLoaded进行加载ApplicationContext。

接着调用所有的initializer的initialize进行对创建好的ApplicationContext进行进一步设置

遍历所有的Listeners的contextPrepared,告诉Listener已经准备好ApplicationContext文件了,(这一步很核心)获取所有的@EnableAutoConfiguration的单例配置javaConfig bean对象以及其他IOC配置加载到准备完毕的ApplicationContext,并调用contextLoaded进行加载ApplicationContext,装载完毕。

(这一步很核心)获取所有的@EnableAutoConfiguration的单例配置javaConfig bean对象以及其他IOC配置加载到准备完毕的ApplicationContex

9.调用freshContext方法,进行调用ApplicationContext进行刷新,到此处ApplicationContext的设置就完成了。(registerShutdownHook这个属性,就是用来非Web应用中关闭IoC容器的,将会确保你的Spring IoC容器被恰当关闭,以及所有由单例持有的资源都会被释放,

 我们通过调用ApplicationContext.registerShutdownHook()来注册钩子函数,实现bean的destroy,Spring容器的关闭,通过实现这些方法来实现平滑关闭,  注意:我们当前讨论的都是Spring非Web程序,如果是Web程序的话,不需要我们来注册钩子函数,Spring的Web程序已经有了相关的代码实现优雅关闭了,应用场景:

既然JDK提供的这个方法可以注册一个JVM关闭的钩子函数,那么这个函数在什么情况下会被调用呢?上述我们展示了在程序异常情况下会被调用,还有没有其他场景呢?

   * 程序正常退出

    * 使用System.exit()

    * 终端使用Ctrl+C触发的中断

    * 系统关闭

    * OutofMemory宕机

    * 使用Kill pid杀死进程(使用kill -9是不会被调用的))

11.调用遍历调用Listener.started, 广播ApplicationStartedEvent事件。

12.从ApplicationContext进行查找所有的ApplicationRunner和CommandLineRunner,如果存在就执行这些线程的run事件。

13.最后一步启动线程监听,遍历所有的线程running方法,进行广播ApplicationReadyEvent事件,开启监听听。(到这一步就整个Springboot启动就完成了,启动过程冗长,也增加了很多拓展点,旧的Springboot 版本还会有finish的方法就是跟这个running方法差不多,此处的Springboot版本是v2.1.3.RELEASE)

整个Springboot的精简过后的启动逻辑是

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值