文章目录

  • 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 依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.zqh.test</groupId><artifactId>springBootDemo</artifactId><version>1.0-SNAPSHOT</version><dependencies><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.6.3</version></dependency></dependencies></project>

运行 MainApplication 类,结果如下,从中可以看出 TestBean 类已经在Spring Boot 启动时已经进行实例化。

2022-02-19 19:49:30.274  INFO 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.276  INFO 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.614  INFO 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包)

3. spring.factories 用于解决什么问题?

在日常开发中,通常将 Bean 注入到 Spring 容器有多种方式,比如 @Autowire、@Import 注解等等,又为什么使用 spring.factories 配置机制呢?

个人理解:当应用依赖三方 jar 包时,spring.factories 配置方式可以使三方 jar 包中的 bean 有选择地注入到 Spring 容器中。 下面以 Spring Boot 的 starter 机制来说明怎么使用 spring.factories 配置文件的。

3.1 业务场景思考及 starter 机制引入

先思考一个场景:应用需要依赖 RedisTemplate 进行缓存操作,怎么引入配置呢? 一般有两种方式:

  • 方式一:将依赖的 RedisTemplate 等相关 Bean 手动一个一个分散注入到业务应用中(比如@Autowire、@Configuration等)
  • 方式二:将依赖的 RedisTemplate 等相关 Bean 统一引入到一个配置类中,并标记为 @Configuration

第一种方式明显不可取,即耦合了业务,而且后续包升级比较麻烦。第二种统一的做法比较推荐,非常易于管理。假如采用方法二将这个标记为 @Configuration 类命名为 RedisAutoConfiguration,则这个类就封装了引入 redis 必须要注入 Spring 的 Bean,以此类推,后续再引入 mysql 时再将 mysql 必须依赖的类统一封装为 DataSourceAutoConfiguration 就可以了。恰好这正是 Spring Boot starter 机制内部的原理,即 Spring Boot starter将各个组件分别统一封装一个固定配置类中,如 redis 相关依赖类统一封装到 RedisAutoConfiguration 类中,数据库依赖类统一封装到 DataSourceAutoConfiguration 类等,然后将这些统一配置类配置到 spring.factories 文件中,Spring Boot在启动的时候(前提配置EnableAutoConfiguration注解,这也是EnableAutoConfiguration注解的由来)会一一扫描依赖 jar 包中 spring.factories 文件,最后将这些类注入到spring 容器中,业务直接引用即可。

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 用法及原理相关推荐

  1. java中的controller_详解Spring Boot中Controller用法

    Controller Controller是SpringBoot里最基本的组件,他的作用是把用户提交来的请求通过对URL的匹配,分配个不同的接收器,再进行处理,然后向用户返回结果.他的重点就在于如何从 ...

  2. spring boot——MockMvc的用法 (SpringBoot 1.5.18)下测试通过

    spring boot--MockMvc的用法 1.pom配置 <dependency><groupId>org.springframework.boot</groupI ...

  3. 【赠书福利】掘金爆火小册同名《Spring Boot源码解读与原理剖析》正式出书了!...

    关注我们丨文末赠书 承载着作者的厚望,掘金爆火小册同名读物<Spring Boot源码解读与原理剖析>正式出书! 本书前身是掘金社区销量TOP的小册--<Spring Boot源码解 ...

  4. 实战:Spring Boot源码解读与原理分析

    承载着作者的厚望,掘金爆火小册同名读物<Spring Boot源码解读与原理剖析>正式出书! 本书前身是掘金社区销量TOP的小册--<Spring Boot源码解读与原理剖析> ...

  5. spring boot + spring mvc 原理解析

    前言:spring mvc 是当前最为流行的一种java WEB 框架.在还没有spring boot以前,通常搭配tomcat等容器进行web项目的开发.而现在spring全家桶越来越完善.慢慢脱离 ...

  6. Spring - Spring Boot Spring Cloud

    Spring -> Spring Boot > Spring Cloud 这几天刚刚上班,公司用的是Spring Cloud,接触不多.我得赶快学起来. 想学习就必须得知道什么是微服务,什 ...

  7. Spring Boot+Spring Cloud基础入门(一)简单介绍

    转自:https://blog.csdn.net/mingwei_cheng/article/details/80939833 在经历了毕业的摧残后,终于又有时间来更新博客了,毕业设计项目是写了一个基 ...

  8. Spring Boot Spring MVC 异常处理的N种方法

    默认行为 根据Spring Boot官方文档的说法: For machine clients it will produce a JSON response with details of the e ...

  9. spring boot + spring batch 读数据库文件写入文本文件读文本文件写入数据库

    好久没有写博客,换了一家新公司,原来的公司用的是spring,现在这家公司用的是spring boot.然后,项目组布置了一个任务,关于两个数据库之间的表同步,我首先想到的就是spring batch ...

最新文章

  1. linux suse10虚拟机在静态IP局域网中如何设置桥接上网
  2. eclipse搭建SSH框架详解
  3. .NET Core 使用 K8S ConfigMap的正确姿势
  4. git clone 分支_Git 小团队的协作 (二)
  5. ROS学习笔记七:使用rqt_console和roslaunch
  6. DRBD+Heratbeat+NFS高可用文件共享存储
  7. android selector
  8. 前端每日实战:76# 视频演示如何用纯 CSS 创作一组单元素办公用品(内含2个视频)...
  9. mybatis 调用 oracle函数_从Oracle到PG 该做的改造工作一个都不能少!
  10. AVEVA PDMS 二次开发之PML语言基础 21/10/21 01.0.02
  11. 学计算机连系统都不会装,Win7系统安装不了iTunes该如何解决-电脑自学网
  12. winrm java客户端_Ansible for Windows:WinRM HTTPS设置
  13. raid数据恢复,Raid5磁盘阵列数据恢复案例,服务器数据恢复
  14. 视频与音频码率计算公式
  15. 感知机不能表示“异或”
  16. SQL错误信息:已更新或删除的行值要么不能使该行成为唯一行、要么改变了多个行
  17. Java白盒测试三角形函数_白盒测试实验报告-三角形形状-山东大学
  18. 菜鸟窝Android百度云视频,菜鸟窝React Native 视频系列教程
  19. python的多线程使用setDaemon有什么意义?
  20. css-边框重叠问题解决

热门文章

  1. Python自制游戏:还原经典款贪吃蛇,表弟玩着玩着都哭了(附源码)
  2. 广告零容忍?B站用户喜欢的“恰饭”方式
  3. [论文阅读笔记58]Learning from Noisy Labels with Deep Neural Networks:A Survey
  4. matlab背景图片上plot绘制图形
  5. Win10:键盘任一键实现了 “一键开机”
  6. 走进产品经理(最佳培训教材)
  7. 安装工程造价课程设计_某单元楼安装工程造价课程设计
  8. 【软件】Ubuntu安装sougopinyin的坑
  9. 编辑制作照片墙Posterino
  10. 三电平SVPWM(小六边形)