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

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 {@Beanpublic 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.rhkb.cn/news/496735.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apifox 12月更新|接口的测试覆盖情况、测试场景支持修改记录、迭代分支能力升级、自定义项目角色权限、接口可评论

Apifox 新版本上线啦!!! 在快速迭代的开发流程中,接口测试工具的强大功能往往决定了项目的效率和质量。而 Apifox 在 12 月的更新中,再次引领潮流,推出了一系列重磅功能!测试覆盖情况分析、场景…

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 …

WebRTC服务质量(12)- Pacer机制(04) 向Pacer中插入数据

WebRTC服务质量(01)- Qos概述 WebRTC服务质量(02)- RTP协议 WebRTC服务质量(03)- RTCP协议 WebRTC服务质量(04)- 重传机制(01) RTX NACK概述 WebRTC服务质量(…

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

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

低代码开发平台排名2024

低代码开发平台在过去几年中迅速崛起,成为企业数字化转型的重要工具。这些平台通过可视化界面和拖放组件,使业务人员和技术人员都能快速构建应用程序,大大缩短了开发周期。以下是一些在2024年值得关注和使用的低代码开发平台。 一、Zoho Cre…

rocketmq-push模式-消费侧重平衡-类流程图分析

1、观察consumer线程 使用arthas分析 MQClientFactoryScheduledThread 定时任务线程 定时任务线程,包含如下任务: 每2分钟更新nameServer列表 每30秒更新topic的路由信息 每30秒检查broker的存活,发送心跳请求 每5秒持久化消费队列的offset…

群落生态学研究进展▌Hmsc包对于群落生态学假说的解读、Hmsc包开展单物种和多物种分析的技术细节及Hmsc包的实际应用

HMSC(Hierarchical Species Distribution Models)是一种用于预测物种分布的统计模型。它在群落生态学中的应用广泛,可以帮助科学家研究物种在不同环境条件下的分布规律,以及预测物种在未来环境变化下的潜在分布范围。 举例来说&a…

影视仓最新接口+内置本包方法的研究(2024.12.27)

近日喜欢上了研究影视的本地仓库内置,也做了一个分享到了群里。 内置本地仓库包的好处很明显,当前线路接口都是依赖网络上的代码站存放,如果维护者删除那就GG。 虽然有高手制作了很多本地包,但推送本地包到APP,难倒一片…

教育元宇宙的优势与核心功能解析

随着科技的飞速发展,教育领域正迎来一场前所未有的变革。教育元宇宙作为新兴的教育形态,以其独特的优势和丰富的功能,正在逐步改变我们的学习方式。本文将深入探讨教育元宇宙的优势以及其核心功能,为您揭示这一未来教育的新趋势。…

多个微服务 Mybatis 过程中出现了Invalid bound statement (not found)的特殊问题

针对多个微服务的场景,记录一下这个特殊问题: 如果启动类上用了这个MapperScan注解 在resource 目录下必须建相同的 com.demo.biz.mapper 目录结构,否则会加载不到XML资源文件 。 并且切记是com/demo/biz 这样的格式创建,不要使用…

Java基础知识(四) -- 面向对象(下)

1.类变量和类方法 1.1 类变量背景 有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩? 思路分析: 核心在于如何让变量count被所有对象共享 public class Child {private String name;// 定义静态变量(所有Child对象共享)public static int count 0;p…

Linux系统之stat命令的基本使用

Linux系统之stat命令的基本使用 一、stat命令 介绍二、stat命令帮助2.1 查询帮助信息2.2 stat命令的帮助解释 三、stat命令的基本使用3.1 查询文件信息3.2 查看文件系统状态3.3 使用格式化输出3.4 以简洁形式打印信息 四、注意事项 一、stat命令 介绍 stat 命令用于显示文件或文…

雷池 WAF 搭配阿里云 CDN 使用教程

雷池 WAF(Web Application Firewall)是一款强大的网络安全防护产品,通过实时流量分析和精准规则拦截,有效抵御各种网络攻击。在部署雷池 WAF 的同时,结合阿里云 CDN(内容分发网络)可以显著提升网…

蓝桥杯速成教程{三}(adc,i2c,uart)

目录 一、adc 原理图​编辑引脚配置 Adc通道使能配置 实例测试 ​编辑效果显示 案例程序 badc 按键相关函数 测量频率占空比 main 按键的过程 显示界面的过程 二、IIC通信-eeprom 原理图AT24C02 引脚配置 不可用状态,用的软件IIC 官方库移植 At24c02手册 ​编辑…

Semantic Segmentation Editor标注工具

https://github.com/Hitachi-Automotive-And-Industry-Lab/semantic-segmentation-editor https://docs.meteor.com/about/install.html https://v2-docs.meteor.com/install.html 安装指定版本的meteor curl https://install.meteor.com/\?release\2.12 | sh ubuntu18 安…

攻防世界web新手第四题easyphp

<?php highlight_file(__FILE__); $key1 0; $key2 0;$a $_GET[a]; $b $_GET[b];if(isset($a) && intval($a) > 6000000 && strlen($a) < 3){if(isset($b) && 8b184b substr(md5($b),-6,6)){$key1 1;}else{die("Emmm...再想想&quo…

vxe-table 实现跨行按钮同时控制两行的编辑状态

vxe-table 写可编辑表格用起来很爽吧&#xff01;有没有遇到下面这种要用一个跨行按钮&#xff0c;控制两行编辑框是否可编辑的情况。是不是官网的方法不好实现了&#xff1f;那么这个应该怎么实现呢。最近刚好碰到这个问题。说下个人的实现思路。 其实也简单&#xff0c;既然官…

ES 磁盘使用率检查及处理方法

文章目录 1. 检查原因2. 检查方法3. 处理方法3.1 清理数据3.2 再次检查磁盘使用率 1. 检查原因 磁盘使用率在 85%以下&#xff0c;ES 可正常运行&#xff0c;达到 85%及以上会影响 PEIM 数据存储。 在 ES 磁盘分配分片控制策略中&#xff0c;为了保护数据节点的安全&#xff0…

论文解读 | EMNLP2024 一种用于大语言模型版本更新的学习率路径切换训练范式

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 作者简介 王志豪&#xff0c;厦门大学博士生 刘诗雨&#xff0c;厦门大学硕士生 内容简介 新数据的不断涌现使版本更新成为大型语言模型&#xff08;LLMs&#xff…

【Linux 系统负载详情解析】

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…