zoukankan      html  css  js  c++  java
  • SpringBoot自动装配原理(转载)

    SpringBoot运行原理,你可能需要知道的秘密!

    SpringBoot运行原理,你可能需要知道的秘密!

    概述

    说到接触 SpringBoot 伊始,给我第一映像最深的是有两个关键元素:

    SpringBoot运行原理,你可能需要知道的秘密!

    对照上面的典型代码,这个两个元素分别是:

    • @SpringBootApplication
    • SpringApplication 以及 run() 方法

    本文内容脑图如下:

    SpringBoot运行原理,你可能需要知道的秘密!

    SpringApplication 惊鸿一瞥

    SpringApplication 这个类应该算是 SpringBoot 框架 的“创新”产物了,原始的 Spring中并没有这个类,SpringApplication 里面封装了一套 Spring 应用的启动流程,然而这对用户完全透明,因此我们上手 SpringBoot 时感觉简洁、轻量。

    一般来说默认的 SpringApplication 执行流程已经可以满足大部分需求,但是 若用户想干预这个过程,则可以通过 SpringApplication 在流程某些地方开启的 扩展点 来完成对流程的扩展,典型的扩展方案那就是使用 set 方法。

    我们来举一个栗子,把我们天天司空见惯的 SpringBoot 应用的启动类来拆解一下写出来:

    SpringBoot运行原理,你可能需要知道的秘密!

    这样一拆解后我们发现,我们也需要先构造 SpringApplication 类对象,然后调用该对象的 run() 方法。那么接下来就讲讲 SpringApplication 的构造过程 以及其 run() 方法的流程,搞清楚了这个,那么也就搞清楚了SpringBoot应用是如何运行起来的!

    SpringApplication 实例的初始化

    我们对照代码来看:

    SpringBoot运行原理,你可能需要知道的秘密!

    四个关键的步骤已标注在图中,分别解释如下:

    • 推断应用的类型:创建的是 REACTIVE应用、SERVLET应用、NONE 三种中的某一种
    SpringBoot运行原理,你可能需要知道的秘密!

    • 使用 SpringFactoriesLoader查找并加载 classpath下 META-INF/spring.factories文件中所有可用的 ApplicationContextInitializer
    SpringBoot运行原理,你可能需要知道的秘密!

    • 使用 SpringFactoriesLoader查找并加载 classpath下 META-INF/spring.factories文件中的所有可用的 ApplicationListener
    SpringBoot运行原理,你可能需要知道的秘密!

    推断并设置 main方法的定义类

    SpringBoot运行原理,你可能需要知道的秘密!

    SpringApplication 的run()方法探秘

    先看看代码长啥样子:

    SpringBoot运行原理,你可能需要知道的秘密!

    各个主要步骤我已经标注在上图之中了,除此之外,我也按照自己的理解画了一个流程图如下所示,可以对照数字标示看一下:

    SpringBoot运行原理,你可能需要知道的秘密!

    我们将各步骤总结精炼如下:

    1. 通过 SpringFactoriesLoader 加载 META-INF/spring.factories 文件,获取并创建 SpringApplicationRunListener 对象
    2. 然后由 SpringApplicationRunListener 来发出 starting 消息
    3. 创建参数,并配置当前 SpringBoot 应用将要使用的 Environment
    4. 完成之后,依然由 SpringApplicationRunListener 来发出 environmentPrepared 消息
    5. 创建 ApplicationContext
    6. 初始化 ApplicationContext,并设置 Environment,加载相关配置等
    7. 由 SpringApplicationRunListener 来发出 contextPrepared 消息,告知SpringBoot 应用使用的 ApplicationContext 已准备OK
    8. 将各种 beans 装载入 ApplicationContext,继续由 SpringApplicationRunListener 来发出 contextLoaded 消息,告知 SpringBoot 应用使用的 ApplicationContext 已装填OK
    9. refresh ApplicationContext,完成IoC容器可用的最后一步
    10. 由 SpringApplicationRunListener 来发出 started 消息
    11. 完成最终的程序的启动
    12. 由 SpringApplicationRunListener 来发出 running 消息,告知程序已运行起来了

    至此,全流程结束!

    喜欢的小伙伴,点个关注吧,每天分享新的内容!

  • 相关阅读:
    Ymodem协议(参考STM32)
    嵌入式 Linux 对内存的直接读写(devmem)
    四则运算表达式分解,前中后缀表达式(栈的应用)
    I2C总线的仲裁机制
    用例图【图7】--☆
    顺序图【6】--☆☆
    部署图【图5】--☆
    组件图【图4】--☆
    活动图、泳道【图1】--☆☆
    Mybatis增删改查(CURD)
  • 原文地址:https://www.cnblogs.com/hujesse4/p/14755486.html
Copyright © 2011-2022 走看看