述
上文中,介绍了三种系统初始化器的使用,那么本文来看一下,系统初始化器是如何被Spring Boot容器加载的
框架初始化步骤图
Spring Boot 启动是分为两步,先是初始化框架,然后再启动,系统初始化器的加载如何,就再框架初始化的步骤中,下面来看一下代码
源码跟踪
首先通过启动类,点击进入源码,然后找到创建 SpringApplication
对象的代码,如下:
这里重点看 setInitializers()
里面的 getSpringFactoriesInstances()
方法, 点进去,源码如下:
这里断点处的方法就是具体的实现,点进去,代码如下:
每段代码的作用都再图中标注了,这里主要就是从项目中的所有jar中,找到 META-INF/spring.factories
这个文件,然后读取里面的内容,然后返回成一个map
加载完毕之后,会为所有的初始化器创建实例,代码如下:
这里把所有的实例都创建出来,然后下面进行了一下排序,具体的排序源码这里就不贴了.
到这里所有的 spring.factories
里指定的系统初始化器就都被加载出来了
SpringFactoriesLoader
本文的重点就是 SpringFactoriesLoader
这个类,总结如下:
- 框架内部使用的通用工厂加载机制
- 从classpath下面多个jar包的指定位置去读取文件,然后加载成对象
- 文件内容必须是key-value形式,即properties类型
- key是全限定名(抽象类 || 接口), value是实现类,多个实现用逗号分隔
总结
loadSpringFactories
的整体流程图: