【SpringBoot】自动配置原理与自定义启动器
Spring Boot 自动配置原理与自定义启动器
目录标题
- Spring Boot 自动配置原理与自定义启动器
- 摘要
- 1. 引言
- 2. Spring Boot自动配置原理分析
- 2.1 自动配置的核心流程
- 2.2 核心注解与配置文件解析
- 2.2.1 @EnableAutoConfiguration
- 2.2.2 spring.factories 文件
- 2.3 自动配置类剖析
- 2.4 配置属性类的作用
- 3. 条件化配置机制研究
- 3.1 条件注解体系
- 3.2 条件注解的应用场景
- 3.3 自动配置报告
- 4. 自定义启动器(Starter)实现
- 4.1 自定义启动器的结构
- 4.2 实现一个简单的自定义启动器
- 4.2.1 创建启动器项目结构
- 4.2.2 开发核心业务逻辑类
- 4.2.3 创建配置属性类
- 4.2.4 实现自动配置类
- 4.2.5 创建 spring.factories 文件
- 4.2.6 配置启动器依赖
- 4.3 使用自定义启动器
- 5. 结论与展望
- 5.1 研究结论
- 5.2 应用价值
- 5.3 未来研究方向
- 参考文献
摘要
本文深入探讨了Spring Boot框架中自动配置的工作原理和实现机制。自动配置作为Spring Boot的核心特性之一,极大地简化了Java企业级应用的开发流程。本研究首先分析了自动配置的实现过程,包括@EnableAutoConfiguration注解的工作机制及spring.factories文件的角色;其次,详细阐述了条件化配置(@Conditional)体系如何使自动配置更加灵活;最后,通过设计并实现自定义启动器(Starter),验证了自动配置原理的实际应用。本文对于理解Spring Boot内部工作机制以及优化框架使用有重要参考价值。
关键词:Spring Boot;自动配置;条件化配置;自定义启动器;spring.factories
1. 引言
随着微服务架构的普及,Spring Boot作为现代Java应用开发的主流框架,凭借其"约定优于配置"的理念,大大简化了企业级应用的开发流程。在Spring Boot的众多特性中,自动配置机制尤为核心,它使开发者能够专注于业务逻辑实现,而无需过多关注底层框架配置细节。本研究通过深入分析Spring Boot的自动配置原理,为开发者提供框架内部工作机制的透明视图。
本文将重点回答以下问题:
- Spring Boot自动配置的工作原理是什么?
- 配置文件与自动配置之间存在怎样的关联?
- 条件化配置如何增强了自动配置的灵活性?
- 如何基于自动配置原理设计自定义启动器?
2. Spring Boot自动配置原理分析
2.1 自动配置的核心流程


Spring Boot应用启动时,自动配置的实现遵循一个清晰的流程,如图1所示:

图1:Spring Boot 自动配置执行流程

自动配置实现的核心步骤如下:
-
启动加载:SpringBoot应用启动时,加载主配置类上的
@SpringBootApplication注解。 -
激活自动配置:
@SpringBootApplication注解包含@EnableAutoConfiguration注解,此注解开启自动配置功能。 -
导入选择器:
@EnableAutoConfiguration通过@Import导入AutoConfigurationImportSelector类,该类负责筛选和加载自动配置类。 -
加载候选配置:
AutoConfigurationImportSelector调用getAutoConfigurationEntry()方法,进而调用getCandidateConfigurations()方法加载候选配置。 -
扫描配置文件:通过
SpringFactoriesLoader.loadFactoryNames()方法,扫描所有jar包中的META-INF/spring.factories文件。 -
过滤和实例化:根据条件注解对配置类进行过滤,将符合条件的配置类加入IoC容器。
7.面试题‘
2.2 核心注解与配置文件解析
2.2.1 @EnableAutoConfiguration
@EnableAutoConfiguration 是 Spring Boot 自动配置的核心注解,它通过 @Import 引入 AutoConfigurationImportSelector,该选择器负责从 META-INF/spring.factories 中加载自动配置类。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";Class<?>[] exclude() default {};String[] excludeName() default {};
}
2.2.2 spring.factories 文件
spring.factories 文件是自动配置的关键组成部分,它位于 META-INF 目录下,采用 Properties 格式,定义了各种类型的自动配置实现类:
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
...
每个自动配置类都是容器中的组件,它们会根据条件注解决定是否生效。
2.3 自动配置类剖析
以 HttpEncodingAutoConfiguration 为例,该类负责 HTTP 编码的自动配置:
@Configuration
@EnableConfigurationProperties({HttpProperties.class})
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({CharacterEncodingFilter.class})
@ConditionalOnProperty(prefix = "spring.http.encoding",value = {"enabled"},matchIfMissing = true
)
public class HttpEncodingAutoConfiguration {private final Encoding properties;public HttpEncodingAutoConfiguration(HttpProperties properties) {this.properties = properties.getEncoding();}@Bean@ConditionalOnMissingBeanpublic CharacterEncodingFilter characterEncodingFilter() {CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();filter.setEncoding(this.properties.getCharset().name());filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));return filter;}// ...
}
分析这个自动配置类可以得出:
-
@Configuration:表明这是一个配置类,可以向容器中添加组件。 -
@EnableConfigurationProperties({HttpProperties.class}):启用HttpProperties的配置绑定功能,并将其加入容器。 -
@ConditionalOnWebApplication:仅在Web应用环境下生效。 -
@ConditionalOnClass({CharacterEncodingFilter.class}):仅在CharacterEncodingFilter类存在时生效。 -
@ConditionalOnProperty:根据配置文件中的属性决定是否生效,matchIfMissing = true表示属性不存在时也视为匹配。 -
@Bean方法:向容器中添加组件,组件的属性从HttpProperties中获取。
2.4 配置属性类的作用
每个自动配置类通常对应一个或多个配置属性类,如 HttpProperties:
@ConfigurationProperties(prefix = "spring.http")
public class HttpProperties {// 属性和方法
}
这些属性类通过 @ConfigurationProperties 注解与配置文件绑定,开发者可以在配置文件中修改属性值,从而影响自动配置的行为。
3. 条件化配置机制研究
条件化配置是 Spring Boot 自动配置灵活性的关键,它通过 @Conditional 系列注解控制配置类的生效条件。
3.1 条件注解体系
Spring Boot提供了丰富的条件注解体系,如图2所示:

图2:Spring Boot条件注解体系
3.2 条件注解的应用场景
条件注解根据不同场景控制自动配置类的生效条件:
-
类加载条件
@ConditionalOnClass:当指定的类存在于类路径时,配置生效@ConditionalOnMissingClass:当指定的类不存在于类路径时,配置生效
-
Bean条件
@ConditionalOnBean:当指定的Bean存在于容器中时,配置生效@ConditionalOnMissingBean:当指定的Bean不存在于容器中时,配置生效@ConditionalOnSingleCandidate:当指定类型的Bean只有一个或有一个主要候选者时,配置生效
-
属性条件
@ConditionalOnProperty:当配置文件中指定的属性满足条件时,配置生效
-
资源条件
@ConditionalOnResource:当类路径下存在指定资源时,配置生效
-
Web应用条件
@ConditionalOnWebApplication:当应用是Web应用时,配置生效@ConditionalOnNotWebApplication:当应用不是Web应用时,配置生效
-
其他条件
@ConditionalOnJava:当JVM版本满足要求时,配置生效@ConditionalOnExpression:当SpEL表达式评估为true时,配置生效@ConditionalOnJndi:当JNDI上下文中存在指定项时,配置生效
3.3 自动配置报告
Spring Boot提供了调试功能,可以查看哪些自动配置类生效或未生效:
# 开启自动配置报告
debug=true
启用该配置后,控制台会输出详细的自动配置报告:
- Positive matches:成功匹配并生效的自动配置类
- Negative matches:由于条件不满足而未生效的自动配置类
- Unconditional classes:无条件生效的自动配置类
这一功能对于排查配置问题和优化应用尤为重要。
4. 自定义启动器(Starter)实现
自定义启动器是 Spring Boot 自动配置原理的实际应用,它封装特定功能并实现自动配置。

4.1 自定义启动器的结构
标准的自定义启动器通常包含两个模块,如图3所示:

图3:自定义Starter组件结构
自定义启动器的命名约定:
- 官方启动器:
spring-boot-starter-xxx - 自定义启动器:
xxx-spring-boot-starter
4.2 实现一个简单的自定义启动器
以实现一个简单的问候服务为例,演示自定义启动器的开发流程:
4.2.1 创建启动器项目结构
- 创建一个空的父项目
hello-spring-boot-starter - 创建一个实际的依赖模块
hello-spring-boot-starter-autoconfigure
4.2.2 开发核心业务逻辑类
public class HelloService {private HelloProperties properties;public HelloProperties getProperties() {return properties;}public void setProperties(HelloProperties properties) {this.properties = properties;}public String sayHello(String name) {return properties.getPrefix() + name + properties.getSuffix();}
}
4.2.3 创建配置属性类
@ConfigurationProperties(prefix = "hello")
public class HelloProperties {private String prefix = "Hello, ";private String suffix = "!";// getter and setter methodspublic String getPrefix() {return prefix;}public void setPrefix(String prefix) {this.prefix = prefix;}public String getSuffix() {return suffix;}public void setSuffix(String suffix) {this.suffix = suffix;}
}
4.2.4 实现自动配置类
@Configuration
@ConditionalOnWebApplication
@EnableConfigurationProperties(HelloProperties.class)
public class HelloServiceAutoConfiguration {@Autowiredprivate HelloProperties helloProperties;@Bean@ConditionalOnMissingBeanpublic HelloService helloService() {HelloService service = new HelloService();service.setProperties(helloProperties);return service;}
}
4.2.5 创建 spring.factories 文件
在 META-INF 目录下创建 spring.factories 文件:
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.hello.HelloServiceAutoConfiguration
4.2.6 配置启动器依赖
在 hello-spring-boot-starter 的 pom.xml 中添加对自动配置模块的依赖:
<dependencies><dependency><groupId>com.example</groupId><artifactId>hello-spring-boot-starter-autoconfigure</artifactId><version>0.0.1-SNAPSHOT</version></dependency>
</dependencies>
4.3 使用自定义启动器
在应用项目中引入自定义启动器:
<dependency><groupId>com.example</groupId><artifactId>hello-spring-boot-starter</artifactId><version>0.0.1-SNAPSHOT</version>
</dependency>
在应用中使用:
@RestController
public class HelloController {@Autowiredprivate HelloService helloService;@GetMapping("/hello/{name}")public String hello(@PathVariable String name) {return helloService.sayHello(name);}
}
在配置文件中自定义属性:
hello.prefix="欢迎, "
hello.suffix="!"
5. 结论与展望
5.1 研究结论
本研究通过对Spring Boot自动配置机制的深入分析,揭示了其核心工作原理:
-
Spring Boot通过
@EnableAutoConfiguration注解和spring.factories文件实现自动配置类的加载。 -
条件注解体系使得自动配置具有高度的灵活性,能够根据应用环境和配置动态调整行为。
-
配置属性类通过与配置文件绑定,实现了对自动配置行为的外部化控制。
-
自定义启动器为开发者提供了一种标准化的方式来封装和复用功能模块。
5.2 应用价值
理解Spring Boot自动配置原理的价值在于:
-
减少配置复杂性:开发者能够更好地利用自动配置,专注于业务逻辑。
-
提高调试效率:了解自动配置的工作机制,有助于快速定位和解决配置问题。
-
优化应用性能:通过有针对性地启用或禁用自动配置,可以减少不必要的组件初始化。
-
模块化开发:掌握自定义启动器的开发,有助于实现更好的代码组织和复用。
5.3 未来研究方向
未来的研究可以在以下方面进行深入:
-
探索Spring Boot 3.x中自动配置机制的演进和优化。
-
研究自动配置与云原生应用开发的结合。
-
分析自动配置在大规模微服务架构中的最佳实践。
-
设计更高效的条件判断机制,进一步提升自动配置的性能。
参考文献
- Spring Boot官方文档. https://docs.spring.io/spring-boot/docs/current/reference/html/
- Walls, C. (2019). Spring Boot in Action. Manning Publications.
- Gutierrez, F. (2016). Pro Spring Boot. Apress.
- Cosmina, I. & Harrop, R. (2017). Pro Spring 5: An In-Depth Guide to the Spring Framework and Its Tools. Apress.
相关文章:
【SpringBoot】自动配置原理与自定义启动器
Spring Boot 自动配置原理与自定义启动器 目录标题 Spring Boot 自动配置原理与自定义启动器摘要1. 引言2. Spring Boot自动配置原理分析2.1 自动配置的核心流程2.2 核心注解与配置文件解析2.2.1 EnableAutoConfiguration2.2.2 spring.factories 文件 2.3 自动配置类剖析2.4 配…...
Element实现el-dialog弹框移动、全屏功能
1、在Vue项目中src/utils目录中创建dialog.js,用来定义draggable-dialog; import Vue from vue Vue.directive(draggable-dialog, { // 属性名称draggable-dialog,前面加v- 使用bind(el, binding, vnode) {const dialogHeaderEl el.querySe…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数 - 详解(11)
详解(11) 初始化配置解析上下文 senv environ;ngx_memzero(&conf, sizeof(ngx_conf_t));/* STUB: init array ? */conf.args ngx_array_create(pool, 10, sizeof(ngx_str_t));if (conf.args NULL) {ngx_destroy_pool(pool);return NULL;}conf.te…...
千峰React:案例一
做这个案例捏 因为需要用到样式,所以创建一个样式文件: //29_实战.module.css .active{text-decoration:line-through } 然后创建jsx文件,修改main文件:导入Todos,写入Todos组件 import { StrictMode } from react …...
部署Joplin私有云服务器postgres版-docker compose
我曾经使用过一段时间 Joplin,官方版本是收费的,而我更倾向于将数据掌握在自己手中。因此,在多次权衡后,我决定自己搭建 Joplin 服务器并进行尝试。 个人搭建的版本与数据库直连,下面是使用 Docker Compose 配置数据库…...
rust学习笔记6-数组练习704. 二分查找
上次说到rust所有权看看它和其他语言比有什么优势,就以python为例 # Python3 def test():a [1, 3, -4, 7, 9]print(a[4])b a # 所有权没有发生转移del b[4]print(a[4]) # 由于b做了删除,导致a再度访问报数组越界if __name__ __main__:test() 运行结…...
Jsmoke-一款强大的js检测工具,浏览器部署即用,使用方便且高效
目录标题 Jsmoke 🚬🚬 by Yn8rt使用方式界面预览功能特性支持的敏感信息类型 Jsmoke 🚬🚬 by Yn8rt 该插件由 Yn8rt师傅 开发,插件可以理解为主动版的hae和apifinder,因为其中的大多数规则我都引用了&a…...
PyCharm中通过命令行执行`pip`命令下载到哪里了:虚拟环境目录下
PyCharm中通过命令行执行pip命令下载到哪里了:虚拟环境目录下 在PyCharm中通过命令行执行pip命令安装工具包,包的下载位置取决于多种因素 虚拟环境 如果项目使用了虚拟环境(通常是推荐的做法): Windows:虚拟环境通常位于项目目录下的.venv文件夹(默认情况)或你指定…...
Spring Boot操作MaxComputer(保姆级教程)
目录 引言 一、引入依赖 二、配置文件 application.properties(信息用自己的奥) 三、实体类User.java 四、UserController 五、UserService 六、UserDao 七、UserDao.xml 八、postman 访问,成功查询数据 附件(修改和删除数据) 引言…...
Spring的构造注入
1.开发步骤2.构造方法的重载 2.1参数个数不同2.2构造参数个数相同时 3.注入总结 注入:通过Spring的配置文件,为成员变量赋值 Set注入:Spring调用Set方法,通过配置文件,为成员变量赋值 构造注入:Spring调用…...
服务器IPMI用户名、密码批量检查
背景 大规模服务器部署的时候,少不了较多的网管和监测平台,这些平台会去监控服务器的性能、硬件等指标参数,为了便于管理和控制,则需要给服务器IPMI带外管理添加较多的用户,这就需要对较多的服务器检查所对应的IPMI用…...
管理后台环境配置
后端配置及启动 a. 软件安装 1. Java sdk 1.8 2. maven 3.6 3. intellij IDEA 2024 4. Visual C Redistributable 5. mongodb 7.0 6. mysql 8.0 双击安装:mysql-installer-community-8.0.41.0.msi 版本选择:Full,包括服务器和客户端 …...
element-ui infiniteScroll 组件源码分享
简单分享 infiniteScroll 组件源码,主要有以下四个方面: 1、infiniteScroll 页面结构。 2、infiniteScroll 组件属性。 3、组件内部的方法。 4、存在的问题。 一、infiniteScroll 页面结构: 二、页面属性。 2.1 infinite-scroll-disab…...
Pany-v2:LFI漏洞探测与敏感文件(私钥窃取/其他)自动探测工具
地址:https://github.com/MartinxMax/pany 关于Pany-v2 Pany-v2 是一款 LFI(本地文件包含)漏洞探测工具,具备自动识别敏感文件的能力。它能够利用 LFI 漏洞检测并提取 id_rsa 私钥、系统密码文件以及其他可能导致安全风险的敏感信息。该工具…...
供应链管理系统--升鲜宝门店收银系统功能解析,登录、主界面、会员 UI 设计图(一)
供应链管理系统--升鲜宝门店收银系统功能解析,登录、主界面 会员 UI 设计图(一)...
Day11,Hot100(贪心算法)
贪心 (1)121. 买卖股票的最佳时机 第 i 天卖出的最大利润,即在前面最低价的时候买入 class Solution:def maxProfit(self, prices: List[int]) -> int:min_price prices[0]ans 0for price in prices:ans max(ans, price - min_price…...
nss刷题4
[SWPUCTF 2023 秋季新生赛]Pingpingping 看看源码,首先是get传参Ping_ip.exe,然后如果请求了_ping参数,就会执行ping命令,执行三次 <?php highlight_file(__FILE__); error_reporting(0); $_ping $_GET[Ping_ip.exe]; if(isset($_ping…...
Eclipse 编译项目指南
Eclipse 编译项目指南 引言 Eclipse 是一款功能强大的集成开发环境(IDE),广泛用于Java、C/C、Python等多种编程语言的开发。在Eclipse中编译项目是进行软件开发的基础步骤。本文将详细介绍如何在Eclipse中编译项目,包括项目设置…...
天佐.乾坤袋 基于抽屉式文件存储的NoSql数据库
天佐.乾坤袋 天佐.乾坤袋 简介 天佐.乾坤袋 基于抽屉式文件存储的NoSql数据库,可用于文件打包,数据整合,加密存放等多种用途。可以方便快捷的搭建和部署存储应用的系统。 传说: 弥勒所有,专做储物之用。拥有不可思议之力&#x…...
win11编译pytorch cuda128版本流程
Geforce 50xx系显卡最低支持cuda128,torch cu128 release版本目前还没有释放,所以自己基于2.6.0源码自己编译wheel包。 1. 前置条件 1. 使用visual studio installer 安装visual studio 2022,工作负荷选择【使用c的桌面开发】,安装完成后将…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...
Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...
动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...
