当前位置: 首页 > news >正文

《学会 SpringBoot 系列 · spring.factories 详解》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗
🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

    • 写在前面的话
    • spring.factories 示例
    • Spring Boot 3.x 的变动
    • 是否需要 @Configuration
    • 总结陈词

CSDN.gif

写在前面的话

spring.factories 文件是 Spring Boot 项目中的一个重要配置文件,用于定义自动配置、环境后处理器和其他 Spring Boot 组件的实现。这个文件通常位于 META-INF 目录下,Spring Boot 在启动时会读取这个文件,以便加载相应的配置和功能。
此篇博文分享一下 spring.factories 的相关用法。

推荐文章 - 程序猿入职必会:
《程序猿入职必会(1) · 搭建拥有数据交互的 SpringBoot 》
《程序猿入职必会(2) · 搭建具备前端展示效果的 Vue》
《程序猿入职必会(3) · SpringBoot 各层功能完善 》
《程序猿入职必会(4) · Vue 完成 CURD 案例 》
《程序猿入职必会(5) · CURD 页面细节规范 》
《程序猿入职必会(6) · 返回结果统一封装》
《程序猿入职必会(7) · 前端请求工具封装》
《程序猿入职必会(8) · 整合 Knife4j 接口文档》
《程序猿入职必会(9) · 用代码生成器快速开发》
《程序猿入职必会(10) · 整合 Redis(基础篇)》
《程序猿入职必会(11) · 整合 Redis 实战运用》

推荐文章 - 学会 SpringMVC 系列
《学会 SpringMVC 系列 · 基础篇》
《学会 SpringMVC 系列 · 剖析篇(上)》
《学会 SpringMVC 系列 · 剖析入参处理》
《学会 SpringMVC 系列 · 剖析出参处理》
《学会 SpringMVC 系列 · 返回值处理器》
《学会 SpringMVC 系列 · 消息转换器 MessageConverters》
《学会 SpringMVC 系列 · 写入拦截器 ResponseBodyAdvice》
《学会 SpringMVC 系列 · 剖析初始化》
《学会 SpringMVC 系列 · 参数解析器 ArgumentResolvers》


spring.factories 示例

先上一段示例,如下所示:

# EnableAutoConfiguration 允许注册自动配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.lw.sbex.ExternalConfig# EnvironmentPostProcessor 允许你在应用程序上下文创建之前修改环境。
org.springframework.boot.env.EnvironmentPostProcessor=\com.lw.sbdemo2.common.custom.CustomEnvironmentPostProcessor# SpringApplicationRunListener 允许你在应用程序的不同生命周期阶段进行操作。
org.springframework.boot.SpringApplicationRunListener=\com.lw.sbdemo2.common.start.CustomSpringApplicationRunListener

解析一下这个文件内容:

  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration
    这一行定义了自动配置类,Spring Boot 的自动配置功能可以根据类路径中的库和配置自动配置 Spring 应用程序。
  2. org.springframework.boot.env.EnvironmentPostProcessor
    这一行定义了环境后处理器。环境后处理器允许开发者在 Spring 应用程序的环境准备阶段对环境进行修改。
public class CustomEnvironmentPostProcessor implements EnvironmentPostProcessor {@Overridepublic void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {// 在这里可以添加自定义的环境变量environment.getSystemProperties().put("custom.property", "customValue");System.out.println("Custom property added to environment: custom.property=customValue");}
}
  1. org.springframework.boot.SpringApplicationRunListener
    这一行定义了 Spring 应用程序运行监听器。运行监听器可以在 Spring 应用程序的生命周期中执行特定的操作。
    com.zoe.onelink.business.init.BizDefaultLoggingLevelApplicationRunner:这个类可能用于设置应用程序的默认日志级别,确保在应用启动时日志记录的行为符合预期。
public class CustomSpringApplicationRunListener implements SpringApplicationRunListener {public CustomSpringApplicationRunListener(SpringApplication application, String[] args) {}@Overridepublic void contextPrepared(ConfigurableApplicationContext context) {System.out.println("Application context is prepared.");}@Overridepublic void contextLoaded(ConfigurableApplicationContext context) {System.out.println("Application context is loaded.");}
}

Spring Boot 3.x 的变动

在 Spring Boot 3.x 中,自动配置类的导入可以通过META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件来实现。
如下,ExternalConfig是不在启动类目录的配置类。

com.lw.sbex.ExternalConfig
@Configuration
public class ExternalConfig {@Beanpublic ExternalService external() {return new ExternalService();}
}

注意,只是自动配置功能移动到这边,其他功能,比如环境后置处理器和应用程序运行监听器,还是在 spring.factories,如下所示。

# EnvironmentPostProcessor 允许你在应用程序上下文创建之前修改环境。
org.springframework.boot.env.EnvironmentPostProcessor=\com.lw.sbdemo2.common.custom.CustomEnvironmentPostProcessor# SpringApplicationRunListener 允许你在应用程序的不同生命周期阶段进行操作。
org.springframework.boot.SpringApplicationRunListener=\com.lw.sbdemo2.common.start.CustomSpringApplicationRunListener

是否需要 @Configuration

spring.factories 配置的类一般用于不在启动类路径下的配置类,此时加不加 @Configuration 注解都可以,但建议加上。
@Configuration 注解是 Spring Boot 自动配置机制中必不可少的,它告诉 Spring Boot 哪类是一个配置类,应该被加载和应用。如果你在 spring.factories 中添加的类没有添加 @Configuration 注解,那么它不会被自动配置。
详细见下方说明:
在Spring框架中,使用spring.factories文件来添加自动配置类确实可以实现自动注册Bean,而不需要显式地使用@Configuration注解。这两种方式的区别主要体现在以下几点:
代码侵入性:
1、使用@Configuration注解的方式更加符合Spring的编程模型,具有更好的代码侵入性。这意味着代码的意图更加明确,易于理解和维护。
2、不使用@Configuration注解,仅仅通过spring.factories文件注册自动配置类,代码的侵入性较低,但可能使得代码的意图不够明确,特别是在大型项目中。
功能限制:
1、当使用@Configuration注解时,可以充分利用Spring提供的各种功能,如@Bean、@Component、@Lazy、@Profile等注解,以及条件注解(如@Conditional系列注解)等。
2、不使用@Configuration注解时,虽然仍然可以注册Bean,但无法直接使用上述功能,需要通过其他方式(如Java Config或XML配置)来实现。
配置的优先级:
1、在Spring Boot项目中,使用@Configuration注解的类会按照配置的顺序被加载,这意味着可以通过调整配置类的加载顺序来控制Bean的创建顺序。
2、通过spring.factories文件注册的自动配置类,其加载顺序可能不如@Configuration类那么容易控制。
Bean的作用域:
1、使用@Configuration注解,可以方便地定义Bean的作用域(如prototype、singleton等)。
2、不使用@Configuration注解时,默认情况下所有的Bean都是singleton作用域,要改变作用域需要通过其他配置方式实现。
总之,虽然不使用@Configuration注解也可以通过spring.factories文件添加自动配置类,但从代码的可读性、可维护性以及功能完整性方面考虑,建议使用@Configuration注解。这样可以使代码更加规范,也便于后续的开发和维护。


总结陈词

本篇文章介绍了 SpringBoot 框架中,使用 spring.factories 进行自动配置等诸多操作,仅供参考。
💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

CSDN_END.gif

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • JavaScript 详解
  • 白骑士的C#教学附加篇 5.1 C#开发工具
  • 安全稳定的镭速高端制造业文件传输摆渡系统
  • 在java环境下判断某个元素是否存在
  • 机器学习三要素:模型、策略和算法
  • 深度相机,通过2d检测得到目标坐标系的3d检测框
  • 最佳 5 款 SD 卡照片恢复应用程序,用于从 SD 卡恢复已删除的照片
  • 分层神经网络(DNN)知多少?
  • Java--IO--字符流
  • 记录一个lombok和mybatisplus的问题,@Data注解失效
  • 《基层回忆录》第三章:进城
  • 数据结构初阶——算法复杂度超详解
  • VideoPlayer插件的用法
  • 富格林:活用阻挠欺诈套路计策
  • 从零开始搭建 EMQX 集群压测框架
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • “大数据应用场景”之隔壁老王(连载四)
  • 【Leetcode】104. 二叉树的最大深度
  • Android交互
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • ES6 学习笔记(一)let,const和解构赋值
  • export和import的用法总结
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • input的行数自动增减
  • JAVA之继承和多态
  • js递归,无限分级树形折叠菜单
  • leetcode386. Lexicographical Numbers
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Wamp集成环境 添加PHP的新版本
  • 规范化安全开发 KOA 手脚架
  • 排序(1):冒泡排序
  • 我感觉这是史上最牛的防sql注入方法类
  • 应用生命周期终极 DevOps 工具包
  • Java总结 - String - 这篇请使劲喷我
  • Mac 上flink的安装与启动
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​业务双活的数据切换思路设计(下)
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (1)(1.13) SiK无线电高级配置(六)
  • (4) PIVOT 和 UPIVOT 的使用
  • (poj1.2.1)1970(筛选法模拟)
  • (ZT)一个美国文科博士的YardLife
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二)PySpark3:SparkSQL编程
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (七)Knockout 创建自定义绑定
  • (四)鸿鹄云架构一服务注册中心
  • (算法)前K大的和
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • ******之网络***——物理***
  • .net core 依赖注入的基本用发