Spring Boot 自动配置:从 spring.factories 到 AutoConfiguration.imports

news2024/12/28 7:51:56

Spring Boot 提供了强大的自动配置功能,通过约定优于配置的方式大大简化了应用开发。随着版本迭代,自动配置的实现方式也逐渐优化,从早期的 spring.factories 文件到最新的 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,体现了更好的可维护性和性能改进。

1. spring.factories 的传统方式

在 Spring Boot 的早期版本中,自动配置类是通过 META-INF/spring.factories 文件进行注册的。该文件位于 JAR 包的 META-INF 目录下,Spring Boot 会在启动时通过 SpringFactoriesLoader 加载并执行其中的配置。

配置示例

spring.factories 文件的典型内容如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.config.MyFirstAutoConfiguration,\
com.example.config.MySecondAutoConfiguration
  • 左侧:Spring Boot 识别的接口或抽象类(如 EnableAutoConfiguration)。
  • 右侧:对应的自动配置类(逗号分隔)。
特点
  • 优点:实现简单,集中管理所有自动配置类。
  • 缺点
    • 配置文件较为混乱,不仅包含自动配置,还可能包括监听器等其他组件。
    • 难以维护:所有配置类集中在一个键下,容易导致冲突。
    • 性能问题:加载时需要解析所有内容,效率不高。

2. AutoConfiguration.imports 的新方式

Spring Boot 2.7 开始,引入了新的配置文件 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,专门用于管理自动配置类。这种方式更加模块化和高效,替代了 spring.factories 中的 EnableAutoConfiguration 配置部分。

配置示例

AutoConfiguration.imports 文件内容如下:

# 自动配置类列表
com.example.config.MyFirstAutoConfiguration
com.example.config.MySecondAutoConfiguration

每行一个自动配置类,简单直观,同时支持 # 注释。

特点
  • 更高的性能:只解析与自动配置相关的类,加载速度更快。
  • 更好的可读性:分离了自动配置与其他组件的注册。
  • 向后兼容:虽然推荐使用新方式,但 spring.factories 依然可用。

3. 配合 @AutoConfiguration 使用

AutoConfiguration.imports 文件中列出的类通常会标注 @AutoConfiguration 注解,这是 Spring Boot 2.7 新增的注解,用于标识自动配置类。

使用示例

以下是一个自动配置类的定义:

package com.example.config;

import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@AutoConfiguration
public class MyFirstAutoConfiguration {

    @Bean
    public MyService myService() {
        return new MyService();
    }
}
  • @AutoConfiguration:标识该类为自动配置类。
  • 配合条件注解(如 @ConditionalOnClass),可以控制配置逻辑是否生效。
对比传统的 @Configuration
特性@Configuration@AutoConfiguration
功能通用配置类专注于自动配置
默认加载需要手动引入自动注册
配合条件注解可选常用,控制加载条件

4. 应用场景

适用场景
  • 使用 AutoConfiguration.imports

    • 定制模块化的自动配置。
    • 需要更高的加载效率。
    • 关注 Spring Boot 未来版本的最佳实践。
  • 继续使用 spring.factories

    • 兼容旧项目。
    • 注册除自动配置以外的组件(如监听器或初始化器)。

5. 总结

Spring Boot 的自动配置机制从 spring.factoriesAutoConfiguration.imports 的演进,体现了框架设计的持续优化:

  • 更高效:新方式减少了配置解析的复杂性,提高了启动性能。
  • 更清晰:将自动配置与其他组件的注册分离,提升了维护性。
  • 更灵活:结合 @AutoConfiguration 注解和条件注解,提供更精细的控制。

迁移建议:对于新项目,优先使用 AutoConfiguration.imports@AutoConfiguration;对于旧项目,可以逐步迁移以享受新特性的优势。

如果你正在构建基于 Spring Boot 的模块化应用,建议立即尝试新方式,以获得更好的开发体验!

 

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

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

相关文章

使用VS Code开发ThinkPHP项目

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《ThinkPHP 8高效构建Web应用 夏磊 编程与应用开发丛书 清华大学出版社》【摘要 书评 试读】- 京东图书 ThinkPHP 8开发环境安装-CSDN博客 安装ThinkPHP项目的IDE 常用的集成开发环境(IDE)包括P…

ROS1入门教程6:复杂行为处理

一、新建项目 # 创建工作空间 mkdir -p demo6/src && cd demo6# 创建功能包 catkin_create_pkg demo roscpp rosmsg actionlib_msgs message_generation tf二、创建行为 # 创建行为文件夹 mkdir action && cd action# 创建行为文件 vim Move.action# 定义行为…

Java处理视频思路

1.首先实现断点续传功能。 断点续传实现思路: 前端对文件分块。前端使用多线程一块一块上传,上传前给服务端发一个消息校验该分块是否上传,如果已上传则不再上传。如果从该断点处断网了,下次上传时,前面的分块已经存在…

C#实现调用DLL 套壳读卡程序(桌面程序开发)

背景 正常业务已经支持 读三代卡了,前端调用医保封装好的服务就可以了,但是长护要读卡,就需要去访问万达,他们又搞了一套读卡的动态库,为了能够掉万达的接口,就需要去想办法调用它们提供的动态库方法&…

USB 状态机及状态转换

文章目录 USB 状态机及状态转换连接状态供电状态默认状态地址状态配置状态挂起状态USB 状态机及状态转换 枚举完成之前,USB 设备要经过一系列的状态变化,才能最终完成枚举。这些状态是 连接状态 - attached供电状态 - powered默认状态 - default地址状态 - address配置状态 -…

QT线程 QtConcurrent (深入理解)

QT多线程专栏共有16篇文章,从初识线程到、QMutex锁、QSemaphore信号量、Emit、Sgnals、Slot主线程子线程互相传值同步变量、QWaitCondition、事件循环、QObjects、线程安全、线程同步、线程异步、QThreadPool线程池、ObjectThread多线程操作、 moveToThread等线程操作进行了全…

Linux-Ubuntu之串口通信

Linux-Ubuntu之串口通信 一,串口通信1.串口通信寄存器配置2.串口通信软件实现①手动波特率②自动波特率③主函数 二,printf和scanf实现串口的输入显示 一,串口通信 1.串口通信寄存器配置 串口通信利用接口是这个TTL,下载程序用的…

阿尔萨斯(JVisualVM)JVM监控工具

文章目录 前言阿尔萨斯(JVisualVM)JVM监控工具1. 阿尔萨斯的功能2. JVisualVM启动3. 使用 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff…

41 stack类与queue类

目录 一、简介 (一)stack类 (二)queue类 二、使用与模拟实现 (一)stack类 1、使用 2、OJ题 (1)最小栈 (2)栈的弹出压入序列 (3&#xf…

wangEditor富文本插件在vue项目中使用和媒体上传的实现

wangEditor是前端一个比较流行的简洁易用,功能强大的前端富文本编辑器,支持 JS Vue React,提供了很多丰富的功能,下面手把手教你实现wangWditor富文本插件在vue项目中配置,保存、图片上传等功能。无脑ctrlc即可 基本功…

VMwareTools安装(ubuntu23)

1.打开VMware,菜单栏虚拟机->安装VMwareTools 2.点开光驱,把压缩包复制到桌面 3.解压 如何开启sudo权限: sudo passwd root 之后输入密码查看解压文件夹,执行vmware-install.pl文件 安装过程中碰见如下报错信息:…

jangow-01-1.0.1靶机

靶机 ip:192.168.152.155 把靶机的网络模式调成和攻击机kali一样的网络模式,我的kali是NAT模式, 在系统启动时(长按shift键)直到显示以下界面 ,我们选第二个,按回车。 继续选择第二个,这次按 e 进入编辑页面 接下来,…

C# GDI+数码管数字控件

调用方法 int zhi 15;private void button1_Click(object sender, EventArgs e){if (zhi > 19){zhi 0;}lcdDisplayControl1.DisplayText zhi.ToString();} 运行效果 控件代码 using System; using System.Collections.Generic; using System.Drawing.Drawing2D; using …

Cilium:BPF 和 XDP 参考指南(2021)

大家觉得有意义和帮助记得及时关注和点赞!!! BPF 是 Linux 内核中一个非常灵活与高效的类虚拟机(virtual machine-like)组件, 能够在许多内核 hook 点安全地执行字节码(bytecode )。很多 内核子系统都已经使用了 BPF&a…

LabVIEW条件配置对话框

条件配置对话框(Configure Condition Dialog Box) 要求:Base Development System 当右键单击**条件禁用结构(Conditional Disable Structure)**并选择以下选项时,会显示此对话框: Add Subdiagr…

机器学习-高斯混合模型

文章目录 高斯混合模型对无标签的数据集:使用高斯混合模型进行聚类对有标签的数据集:使用高斯混合模型进行分类总结 高斯混合模型 对无标签的数据集:使用高斯混合模型进行聚类 对有标签的数据集:使用高斯混合模型进行分类 总结

GitLab 服务变更提醒:中国大陆、澳门和香港用户停止提供服务(GitLab 服务停止)

目录 前言 一. 变更详情 1. 停止服务区域 2. 邮件通知 3. 新的服务提供商 4. 关键日期 5. 行动建议 二. 迁移指南 三. 注意事项 四. 相关推荐 前言 近期,许多位于中国大陆、澳门和香港的 GitLab 用户收到了一封来自 GitLab 官方的重要通知。根据这封邮件…

MacOS下TestHubo安装配置指南

TestHubo是一款开源免费的测试管理工具, 下面介绍MacOS私有部署的安装与配置。TestHubo 私有部署版本更适合有严格数据安全要求的企业,支持在本地或专属服务器上运行,以实现对数据和系统的完全控制。 1、Mac 服务端安装 Mac安装包下载地址&a…

css绘制圆并绘制圆的半径

<div class"item1"></div>.item1 {position: relative;width: 420px;height: 420px;border-radius: 50%; /* 圆形 */color: white; /* 文本颜色 */background-color: rgba(154, 227, 36, 0.4); } .item1::before {content: "";position: absol…

【原理图专题】CIS库中有两部分组成的器件怎么查看符号库

在ICS库使用过程中&#xff0c;会遇到比如运放、MOS管等是由两个符号构成的一个器件。比如下图所示的器件&#xff1a; 为了方便我们知道内部结构&#xff0c;很可能把器件拆成两部分&#xff0c;一部分是PMOS&#xff0c;一部分是NMOS。包括大的MCU或芯片也是这样&#xff0c;…