Spring Boot-1-系统初始化器加载原理

上文中,介绍了三种系统初始化器的使用,那么本文来看一下,系统初始化器是如何被Spring Boot容器加载的

框架初始化步骤图

image

Spring Boot 启动是分为两步,先是初始化框架,然后再启动,系统初始化器的加载如何,就再框架初始化的步骤中,下面来看一下代码

源码跟踪

首先通过启动类,点击进入源码,然后找到创建 SpringApplication 对象的代码,如下:

image

这里重点看 setInitializers() 里面的 getSpringFactoriesInstances() 方法, 点进去,源码如下:

image

这里断点处的方法就是具体的实现,点进去,代码如下:

image

每段代码的作用都再图中标注了,这里主要就是从项目中的所有jar中,找到 META-INF/spring.factories 这个文件,然后读取里面的内容,然后返回成一个map

加载完毕之后,会为所有的初始化器创建实例,代码如下:
image

这里把所有的实例都创建出来,然后下面进行了一下排序,具体的排序源码这里就不贴了.

到这里所有的 spring.factories 里指定的系统初始化器就都被加载出来了

SpringFactoriesLoader

本文的重点就是 SpringFactoriesLoader 这个类,总结如下:

  • 框架内部使用的通用工厂加载机制
  • 从classpath下面多个jar包的指定位置去读取文件,然后加载成对象
  • 文件内容必须是key-value形式,即properties类型
  • key是全限定名(抽象类 || 接口), value是实现类,多个实现用逗号分隔

总结

loadSpringFactories 的整体流程图:

image