spring.factories
的基本作用
在若依-微服务版的源码学习中,发现项目中多次用到了 spring.factories
。因此记录一下自己的学习总结:
参考博客:
-
spring.factories
的具体原理可以参考:https://www.jianshu.com/p/00e49c607fa1 -
spring.factories
的基本作用可以参考:https://www.cnblogs.com/huanghzm/p/12217630.html
前提:
在微服务项目中,存在这多个不同的子模块,这些子模块可能是一个独立的Spring Boot
项目,也可能是普通的maven
项目。
问题提出:
我们通常有这么一种需求,将多个子模块都可能用到的组件从单个子模块中抽离出来组成一个公共模块。比如将所有子模块的接口抽离,抽离出来的公共部分也可能存在着需要注入 spring
容器中的组件。
那么这样就引出了一个新的问题。我们都知道 Spring Boot
的自动扫描包的扫描范围是 SpringBootApplication
启动类所在的包以及子包目录下。那么我们抽离出来的公共部分在 SpringBoot
项目启动时就不可能会被自动扫包。
问题解决:
- 在
SpringBootApplication
启动类中添加@import
注解。 - 使用
spring.factories
。
主要介绍 spring.factories
:
spring.factories
文件需要创建在 resources/META-INF
路径下。
main
|-- resources
| └- META-INF
| └-- spring.factories
spring.factories
文件是通过 Properties
解析得到的,所以文件内容格式通常是安装以下方式:
com.xxx.interface=com.xxx.classname
如果一个接口希望配置多个实现类,可以使用 ",
"进行分割。
在若依-微服务版中同样是通过 spring.factories
解决:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.ruoyi.system.api.factory.RemoteUserFallbackFactory,\
com.ruoyi.system.api.factory.RemoteLogFallbackFactory, \
com.ruoyi.system.api.factory.RemoteFileFallbackFactory
通过 spring.factories
文件的方式,在启动服务时(启动SpringBoot
项目)只要引入的包即可实现第三方组件自动扫包。