集成其他框架
主要介绍 starter 与
spring.factories
。
基本解释
前述曾言,在 springboot 中,只要引入 starter,该依赖的所有常规需要的依赖都会被自动引入 spring 容器。那么这一过程究竟是怎样自动实现的呢?答案就是spring.factories
文件。
一个 spring.factories 文件的示例(取自 mybatis-plus-boot-starter )如下,其实就是一个 properties 的键值对配置文件:
# Auto Configure
org.springframework.boot.env.EnvironmentPostProcessor=\
com.baomidou.mybatisplus.autoconfigure.SafetyEncryptProcessor
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.baomidou.mybatisplus.autoconfigure.IdentifierGeneratorAutoConfiguration,\
com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration,\
com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration
在 springboot 项目启动时,其会扫描项目中所有依赖的 jar 包,如果发现其中含有 /META-INF/spring.factories
文件,则会根据该文件中的配置加载相应的 Bean。其中最主要的键是 org.springframework.boot.autoconfigure.EnableAutoConfiguration
,其值是一个类的全路径名称,代表该类将被 spring 纳入 IoC 容器。因此,只需要将一个 @Configuration
配置类作为值赋给 org.springframework.boot.autoconfigure.EnableAutoConfiguration
,springboot 即可加载来自 jar 包中的该配置类,达到引入 maven 坐标即可自动注入 spring 容器的效果。
因此,如果你需要达到这种引入 jar 包即引入 bean 的效果,在你项目中的src/main/resources
下新建一个文件META-INF/spring.factories
,然后在里面使用org.springframework.boot.autoconfigure.EnableAutoConfiguration
指定我们自定义的 bean 的全路径即可。
源码追踪:
@SpringBootApplication
\_ @EnableAutoConfiguration
\_ AutoConfigurationImportSelector#selectImports
\_ AutoConfigurationImportSelector#getAutoConfigurationEntry
\_ AutoConfigurationImportSelector#getCandidateConfigurations
\_ SpringFactoriesLoader#loadFactoryNames
SPI
进一步讨论而言,META-INF/spring.factories
其实是 Spring SPI 指定加载的文件。所谓 SPI(Service Provider Interface),是一种服务提供发现机制,SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,从而加载实现类,这给程序在运行时提供了良好的拓展功能。
许多框架的背后都有 SPI 机制的存在:Java 中有ServiceLoader
,Spring 中有SpringFactoriesLoader
,Dubbo 中有ExtensionLoader
。这些 SPI 机制对扩展程序功能至关重要,可以说理解 SPI 是每一个 javaer 必备的技能。
在 Spring 中,SpringFactoriesLoader
负责加载META-INF/spring.factories
属性配置文件并解析。SpringFactoriesLoader
实际上是 Spring Framework 在 3.2 版本引入的 SPI 机制,在 spring 框架内部一直默默无闻,直至 Spring Boot 和 Spring Cloud 的出现,SpringFactoriesLoader
开始大放异彩。
不过,自 Spring Boot 2.7 开始,spring 不再推荐使用/META-INF/spring.factories
文件,并且在 Spring Boot 3 将移除对/META-INF/spring.factories
的支持。新的写法是创建一个新的文件:/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
,文件内容直接放配置类即可(注意路径中间存在一个 spring/
目录),比如这样:
com.baomidou.mybatisplus.autoconfigure.IdentifierGeneratorAutoConfiguration
com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration
com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration