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.mzph.cn/diannao/65253.shtml

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

相关文章

洪水灾害多智能体分布式模拟示例代码

1. 环境定义:支持灾害动态、地理数据和分布式架构 import numpy as np import random import matplotlib.pyplot as plt# 新疆主要城市及邻接关系 XINJIANG_CITIES {Urumqi: [Changji, Shihezi],Changji: [Urumqi, Shihezi, Turpan],Shihezi: [Urumqi, Changji, K…

华为麦芒5(安卓6)termux记录 使用ddns-go,alist

下载0.119bate1版,不能换源,其他源似乎都用不了,如果root可以直接用面具模块 https://github.com/termux/termux-app/releases/download/v0.119.0-beta.1/termux-app_v0.119.0-beta.1apt-android-5-github-debug_arm64-v8a.apk 安装ssh(非必要) pkg install openssh开启ssh …

FPC在蓝牙耳机中有哪些应用?【新立电子】

随着科技的进步和消费者需求的提升,耳机已经从传统的有线连接转变为现在的无线蓝牙耳机,真正做到了便捷出行与极佳的用户体验。而FPC在蓝牙耳机中的应用主要体现在优化耳机的设计与性能上。 蓝牙耳机,主要使用方式是与手机、电脑等移动设备通…

《计算机组成及汇编语言原理》阅读笔记:p121-p122

《计算机组成及汇编语言原理》学习第 8 天,p121-p122 总结,总计 2 页。 一、技术总结 1.memory优化 (1)cache memory remove blank from “Most computers support two different kinds (levels) of cache: level one (L1) cache is built into the …

CSS(四)display和float

display display 属性用于控制元素的显示类型,用的 display 值包括: block:块级元素 使元素成为块级元素,占据一整行,前后有换行宽度默认为父容器的 100%,可以设置宽高,支持 margin、padding、…

WebGPU入门初识

什么是 WebGPU? WebGPU 是一种现代图形 API,旨在取代 WebGL,提供更高性能和更灵活的 GPU 加速能力。它基于 Vulkan、Metal 和 Direct3D 12,为 Web 开发者带来了类似于原生图形 API 的性能和控制力。 与 WebGL 不同,Web…

ffmpeg: stream_loop报错 Error while filtering: Operation not permitted

问题描述 执行ffmpeg命令的时候,报错:Error while filtering: Operation not permitted 我得命令如下 ffmpeg -framerate 25 -y -i /data/workerspace/mtk/work_home/mtk_202406111543-l9CSU91H1f1b3/tmp/%08d.png -stream_loop -1 -i /data/workerspa…

【微信小程序】1|底部图标 | 我的咖啡店-综合实训

底部图标 引言 在微信小程序开发中,底部导航栏(tabBar)是用户界面的重要组成部分,它为用户提供了快速切换不同页面的功能。今天,我们将通过一个实际案例——“我的咖啡店”小程序,来详细解析如何配置底部图…

docker mysql5.7安装

一.更改 /etc/docker/daemon.json sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://do.nark.eu.org","https://dc.j8.work","https://docker.m.daocloud.io","https:/…

使用Wikitext2数据集对Llama-7B和Llama3-8B模型进行50%权重剪枝的一般步骤和可能的实现方式

以下是使用Wikitext2数据集对Llama-7B和Llama3-8B模型进行50%权重剪枝的一般步骤和可能的实现方式&#xff08;请注意&#xff0c;实际操作可能需要根据具体模型架构和工具进行调整&#xff09;&#xff1a; 1. 环境准备 确保你已经安装了必要的深度学习框架&#xff08;如Py…

【实验记录】动手实现一个简单的神经网络实验(一)

最近上了“神经网络与深度学习”这门课&#xff0c;有一个自己动手实现调整神经网络模型的实验感觉还挺有记录意义&#xff0c;可以帮我巩固之前学习到的理论知识&#xff0c;所以就打算记录一下。 实验大概是使用LeNet&#xff08;卷积神经网络&#xff09;对MINIST数据集做图…

c++编译过程初识

编译过程 预处理&#xff1a;主要是执行一些预处理指令&#xff0c;主要是#开头的代码&#xff0c;如#include 的头文件、#define 定义的宏常量、#ifdef #ifndef #endif等条件编译的代码&#xff0c;具体包括查找头文件、进行宏替换、根据条件编译等操作。 g -E example.cpp -…

Springboot高并发乐观锁

Spring Boot分布式锁的主要缺点包括但不限于以下几点&#xff1a; 性能开销&#xff1a;使用分布式锁通常涉及到网络通信&#xff0c;这会引入额外的延迟和性能开销。例如&#xff0c;当使用Redis或Zookeeper实现分布式锁时&#xff0c;每次获取或释放锁都需要与这些服务进行交…

揭秘 Fluss 架构组件

这是 Fluss 系列的第四篇文章了&#xff0c;我们先回顾一下前面三篇文章主要说了哪些内容。 Fluss 部署&#xff0c;带领大家部署Fluss 环境&#xff0c;体验一下 Fluss 的功能Fluss 整合数据湖的操作&#xff0c;体验Fluss 与数据湖的结合讲解了 Fluss、Kafka、Paimon 之间的…

leetcode82:删除链表中的重复元素II

原题地址&#xff1a;82. 删除排序链表中的重复元素 II - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&…

【面试经典】多数元素

链接&#xff1a;169. 多数元素 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 在本文中&#xff0c;“数组中出现次数超过一半的数字” 被称为 “众数” 。 需要注意的是&#xff0c;数学中众数的定义为 “数组中出现次数最多的数字” &#xff0c;与本文定…

AT24C02学习笔记

看手册&#xff1a; AT24Cxx xx代表能写入xxK bit(xx K)/8 byte 内部写周期很关键&#xff0c;代表每一次页写或字节写结束后时间要大于5ms&#xff08;延时5ms确保完成写周期&#xff09;&#xff0c;否则时序会出错。 页写&#xff1a;型不同号每一页可能写入不同大小的…

蓝牙BLE开发——解决iOS设备获取MAC方式

解决iOS设备获取MAC方式 uniapp 解决 iOS 获取 MAC地址&#xff0c;在Android、iOS不同端中互通&#xff0c;根据MAC 地址处理相关的业务场景&#xff1b; 文章目录 解决iOS设备获取MAC方式监听寻找到新设备的事件BLE工具效果图APP监听设备返回数据解决方式ArrayBuffer转16进制…

01 Oracle 基本操作

Oracle 基本操作 初使用步骤 1.创建表空间 2.创建用户、设置密码、指定表空间 3.给用户授权 4.切换用户登录 5.创建表 注意点&#xff1a;oracle中管理表的基本单位是用户 文章目录 了解Oracle体系结构 1.创建表空间**2.删除表空间**3.创建用户4.给用户授权5.切换用户登录6.表操…

【Linux命令】ps -a 和 ps -ef 的区别

ps -a 和 ps -ef 是 ps&#xff08;process status&#xff09;命令的不同选项&#xff0c;它们用于显示不同的进程信息。以下是这两个选项的主要区别&#xff1a; ps -a -a 选项表示显示所有拥有终端的进程&#xff0c;但不包括守护进程&#xff08;daemon processes&#x…