首先分享之前的所有文章 , 欢迎点赞收藏转发三连下次一定 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164…
Github : 👉 github.com/black-ant
CASE 备份 : 👉 gitee.com/antblack/ca…
一 . 前言
之前说了 SpringBoot 自动配置的地方 , 其中就涉及到 Factories 的加载 , 这一篇详细的把这个流程过一下.
Factories 的作用是工厂类的元数据 , Spring 会通过 .factories 文件将需要初始化的类反射出来
二 . 核心类
Factories 流程中核心的类是 SpringFactoriesLoader , 在 SpringApplication run 时 , 即会加载 Factories相关属性
- spring.factories 配置文件 : Spring 自己的一套 SPI 机制的配置文件
- SpringFactoriesLoader 类,用于加载 spring.factories 配置文件
先看一下 SpringFactoriesLoader 主要流程
1 | java复制代码SpringFactoriesLoader |
三 . 流程
3.1 起点
factories 加载的起点就在 SpringApplication 中.
1 | java复制代码public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { |
3.2 Application 的 Factories 加载流程
1 | java复制代码 |
PS_M2_02_2 详情:
result.add(factoryTypeName, factoryImplementationName.trim())
spring.factories 对应结构
1 | properties复制代码org.springframework.context.ApplicationListener=\ |
可以看到 , factoryTypeName 是第一个节点 , 地下为对应的实现
getResources 和 getSystemResources 的区别
3.3 Environment 流程 加载 loadFactories
加载的起点
加载 Environment 时加载的起点是 SpringApplication , 他的加载主要来自于 SpringListener
1 | java复制代码C- SpringApplication |
加载流程
专门截取出来主要是因为这里调用的方法和上一个是有区别的
loadFactories 除了获取上文的集合 ,同时会通过 instantiateFactory 加载实例 , 他从“META-INF/spring”中加载并实例化给定类型的工厂实现.
1 | java复制代码 |
1 | java复制代码P- FACTORIES_RESOURCE_LOCATION : |
其他主要使用 factories 的位置
1 | java复制代码 |
附录: 2者对比
PS : 看了一下好像没什么区别 , 方式一创建的大多数是 ApplicationContextInitializer 和 ApplicationListener 的对象 , 从而被设置到 SpringApplication 中
3.4 factories 文件的扫描
核心逻辑在 loadSpringFactories 方法中
1 | java复制代码 |
3.5 使用技巧
TODO : 今天不想写了 , 看心情补
四 . 总结
基础 : SPI 机制 + Properties 扫描能力
流程 : 启动时扫描ApplicationContextInitializer + ApplicationListener , 运行时扫描其他相关Factories , 并且实例化
总结 : Factories 比较简单 ,到最后也没看懂为什么会有2种不同的加载途径 , 其底层都是使用 构造器 + instance 实现一个对象 , 猜测可能和加载顺序优化
PS : 有清楚的欢迎在评论告知一下 感谢❤❤❤
更新记录
- V20210804 : 优化布局
本文转载自: 掘金