文章目录
-
-
-
- 1. spring.factories 用法
- 2. spring.factories 实现原理
- 3. spring.factories 用于解决什么问题?
-
- 3.1 业务场景思考及 starter 机制引入
- 3.2 Spring Boot starter 机制
- 4. 小结
-
-
近期看到业务代码里用到 spring.factories 的配置,觉得场景不合适,且网上少有文章提及 spring.factories 与 starter 机制的前因后果,本文借此机会理一下 spring.factories 的用法及原理。简单地说, Spring Boot 的 spring.factories 配置机制类似于 Java SPI,工程代码中在 META-INF/spring.factories 文件中配置接口的实现类名称,然后 Spring Boot 在启动时扫描该配置文件并实例化配置文件中的Bean。 详细看下面用法:
1. spring.factories 用法
- Spring Boot 启动类 MainApplication
package com.zqh.test.springfactories;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author fangchen
* @date 2022-02-19 14:18
*/
@SpringBootApplication
public class MainApplication {public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
- META-INF/ spring.factories 配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.zqh.test.springfactories.TestBean
- TestBean.class 测试Bean
package com.zqh.test.springfactories;
/**
* @author fangchen
* @date 2022-02-19 14:16
*/
public class TestBean {private Long id;
public TestBean() {
System.out.println("test bean init.....");
}public Long getId() {
return id;
}public void setId(Long id) {
this.id = id;
}
}
- pom.xm maven 依赖
4.0.0 com.zqh.test
springBootDemo
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter
2.6.3
运行 MainApplication 类,结果如下,从中可以看出 TestBean 类已经在Spring Boot 启动时已经进行实例化。
2022-02-19 19:49:30.274INFO 20112 --- [main] c.z.t.springfactories.MainApplication: Starting MainApplication using Java 1.8.0_221 on DESKTOP-ITB0Q9I with PID 20112 (D:\code\springBootDemo\target\classes started by NINGMEI in D:\code\springBootDemo)
2022-02-19 19:49:30.276INFO 20112 --- [main] c.z.t.springfactories.MainApplication: No active profile set, falling back to default profiles: default
test bean init.....
2022-02-19 19:49:30.614INFO 20112 --- [main] c.z.t.springfactories.MainApplication: Started MainApplication in 0.595 seconds (JVM running for 0.864)
2. spring.factories 实现原理 Spring Boot 启动时先读取 spring.factories 的类列表,然后再一个个实例化,并放到 Spring 上下文中。代码比较简单,不再详述,直接看图。
- 源码类:org.springframework.core.io.support.SpringFactoriesLoader(spring-core包)
文章图片
个人理解:当应用依赖三方 jar 包时,spring.factories 配置方式可以使三方 jar 包中的 bean 有选择地注入到 Spring 容器中。 下面以 Spring Boot 的 starter 机制来说明怎么使用 spring.factories 配置文件的。
3.1 业务场景思考及 starter 机制引入 先思考一个场景:应用需要依赖 RedisTemplate 进行缓存操作,怎么引入配置呢? 一般有两种方式:
- 方式一:将依赖的 RedisTemplate 等相关 Bean 手动一个一个分散注入到业务应用中(比如@Autowire、@Configuration等)
- 方式二:将依赖的 RedisTemplate 等相关 Bean 统一引入到一个配置类中,并标记为 @Configuration
文章图片
3.2 Spring Boot starter 机制 理解了上面,Spring Boot starter 机制的原理和定义就比较清晰了。再理解一下下面这段话:springboot starter 是一种插件机制,抛弃了之前繁琐的配置,将复杂依赖统一集成进 starter。starter 的出现极大的帮助开发者们从繁琐的框架配置中解放出来,从而更专注于业务代码,并且 springboot 官方提供除了企业级项目不同场景的 starter 依赖模块,可以很便捷的集成进项目,比如 springboot 项目需要依赖 redis,我们只需要加入 spring-boot-starter-data-redis 依赖,并配置一些必须的连接信息即可以使用。
4. 小结 从 Spring Boot starter 机制的原理来理解 spring.factories 配置似乎更好理解一些,至于为了实现 Spring Boot starter 机制才引入 spring.factories 配置,还是先有 spring.factories 配置才有 Spring Boot starter 机制的取巧,那就不得而知了。总之,spring.factories 配置为 Spring Boot 的自动装配提供了方便,在此基础上产生的 Spring Boot starter 机制为很多中间件开发带来了方便。
【#|Spring Boot spring.factories 用法及原理】欢迎如转载,请注明出处!欢迎关注微信公众号:方辰的博客
推荐阅读
- 技术分享|SpringBoot 底层原理剖析
- #|微信小程序 + 腾讯位置服务获取全国城市列表
- springBoot|SpringBoot中Excel的上传
- 后端|2022 年最新 Java 后端薪资统计出炉,看看你有没有拖后腿
- 学习总结|SpringBoot知识点学习总结
- Springboot|Springboot 重点知识点最强整理
- SSM框架学习|SSM框架学习——SpringBoot之基础配置
- springcloud|eureka服务单节点搭建以及集群的搭建
- spring|Springboot 项目中实现文件上传(封装成上传工具模块)