【Spring篇08】:理解自动装配,从spring.factories到.imports剖析

文章目录

  • 1. 自动化装配的起点:`@SpringBootApplication`
  • 2. 自动化装配的核心机制:`@EnableAutoConfiguration` 和 `AutoConfigurationImportSelector`
  • 3. 自动化配置的注册方式:`spring.factories` 与 `.imports`
    • 3.1 早期版本:`META-INF/spring.factories`
    • 3.2 现代版本:`META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports`
  • 4. 运行时类路径:自动化配置的基础
  • 5. 条件判断:决定配置是否生效
  • 6. 总结

Spring Boot 自动化装配是其最引人注目的特性之一,它极大地简化了 Spring 应用的配置,让开发者能够更专注于业务逻辑本文将带深入探讨 Spring Boot 自动化装配的原理,并回顾其从早期版本到现代版本的演进过程

1. 自动化装配的起点:@SpringBootApplication

每个 Spring Boot 应用的入口点通常都有一个 @SpringBootApplication 注解这个复合注解是自动化装配的起点,它集成了三个核心注解:

  • @SpringBootConfiguration: 标记当前类为配置类,等同于 @Configuration
  • @EnableAutoConfiguration: 开启 Spring Boot 自动化装配的关键注解
  • @ComponentScan: 开启组件扫描,用于发现和注册应用内的 Bean

其中,@EnableAutoConfiguration 是自动化装配的核心


2. 自动化装配的核心机制:@EnableAutoConfigurationAutoConfigurationImportSelector

@EnableAutoConfiguration 注解内部通过 @Import 注解导入了一个名为 AutoConfigurationImportSelector 的类

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class}) // 核心在这里!
public @interface EnableAutoConfiguration {// ...
}

AutoConfigurationImportSelector 的主要职责是在应用启动时,找到并加载所有符合条件的自动化配置类


3. 自动化配置的注册方式:spring.factories.imports

Spring Boot 自动化配置类并不是随便放在项目中的,它们需要被“注册”起来,以便 AutoConfigurationImportSelector 能够发现它们在 Spring Boot 的不同版本中,注册方式有所演进

3.1 早期版本:META-INF/spring.factories

在 Spring Boot 2.7 版本之前,自动化配置类主要通过 META-INF/spring.factories 文件进行注册这个文件位于 JAR 包的 META-INF 目录下,遵循 Java 的 Service Provider Interface (SPI) 机制

spring.factories 是一个属性文件,其中 org.springframework.boot.autoconfigure.EnableAutoConfiguration 键对应的值就是自动化配置类的全限定名列表,用逗号分隔

# 示例:早期版本 Starter 中的 META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration

AutoConfigurationImportSelector 在早期版本中主要依赖 SpringFactoriesLoader 工具类来读取这些 spring.factories 文件SpringFactoriesLoader 会扫描当前应用的整个运行时类路径,查找所有 JAR 包中的 META-INF/spring.factories 文件,并加载指定键对应的值

3.2 现代版本:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

从 Spring Boot 2.7 版本开始,为了使自动化配置的注册更加清晰和规范,引入了 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 这个专门用于注册自动化配置类的文件

这个文件每行包含一个自动化配置类的全限定名

# 示例:现代版本 Starter 中的 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration

在 Spring Boot 2.7+ 版本中,AutoConfigurationImportSelector 会同时从 spring.factories.imports 文件中加载自动化配置类如我们之前分析的 getCandidateConfigurations 方法所示:

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {// 从 spring.factories 加载List<String> configurations = new ArrayList(SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader()));// 从 .imports 文件加载 (Spring Boot 2.7+ 新增)ImportCandidates.load(AutoConfiguration.class, this.getBeanClassLoader()).forEach(configurations::add);// ... 检查是否找到配置类return configurations;
}

在 Spring Boot 3.x 版本中,.imports 文件成为了主要和推荐的自动化配置注册方式


4. 运行时类路径:自动化配置的基础

无论是 spring.factories 还是 .imports 文件,AutoConfigurationImportSelector 能够找到它们的前提是它们所在的 JAR 包存在于应用的 运行时类路径 (Runtime Classpath)

运行时类路径是 JVM 在运行的 Java 应用程序时,用来查找和加载 .class 文件的路径集合它包括:

  • 自己的项目编译输出的 .class 文件
  • 项目依赖的所有 JAR 包
  • JDK 自带的类库

SpringFactoriesLoaderImportCandidates 工具类正是利用了 JVM 的类加载机制,遍历整个运行时类路径,查找指定位置的资源文件当通过 Maven 或 Gradle 引入一个 Spring Boot Starter 或其他包含自动化配置的 JAR 包时,这个 JAR 包就会被添加到的运行时类路径中,从而使得其中的 spring.factories.imports 文件能够被 Spring Boot 发现


5. 条件判断:决定配置是否生效

找到自动化配置类只是第一步Spring Boot 的自动化装配之所以智能,是因为它会根据当前应用程序的环境来决定哪些配置类应该真正生效这个决策过程依赖于一系列的条件注解

这些条件注解通常加在自动化配置类或其中的 @Bean 方法上常见的条件注解包括:

  • @ConditionalOnClass: 当指定的类存在于运行时类路径中时生效
  • @ConditionalOnMissingBean: 当 Spring 容器中不存在指定类型的 Bean 时生效
  • @ConditionalOnProperty: 当指定的配置属性存在且符合指定值时生效
  • @ConditionalOnResource: 当指定的资源文件存在于类路径中时生效
  • @ConditionalOnWebApplication: 当应用程序是 Web 应用时生效
  • 等等…

AutoConfigurationImportSelector 在加载了候选的自动化配置类名后,会进一步检查这些类上的条件注解只有当所有条件注解都满足时,这个自动化配置类才会被激活,其中的 Bean 定义才会被注册到 Spring 容器中

举例来说:

如果引入了 spring-boot-starter-data-redis 依赖,那么 Redis 相关的 JAR 包会出现在的运行时类路径中,其中包含 RedisOperations.class 等类spring-boot-autoconfigure 模块中的 RedisAutoConfiguration 类上带有 @ConditionalOnClass({ RedisOperations.class, RedisConnectionFactory.class }) 注解因为这些类存在,条件满足,RedisAutoConfiguration 生效,Spring Boot 自动为配置 Redis 相关的 Bean

如果没有引入该依赖,这些类不存在,条件不满足,RedisAutoConfiguration 被忽略


6. 总结

Spring Boot 自动化装配是一个强大而智能的特性,它通过以下机制实现:

  • @EnableAutoConfiguration: 开启自动化装配
  • AutoConfigurationImportSelector: 核心选择器,负责查找和加载自动化配置类
  • 注册文件 (spring.factories.imports): 声明哪些类是自动化配置类,位于 JAR 包的特定位置
  • 运行时类路径: 这些注册文件必须存在于应用的运行时类路径中才能被发现
  • 条件注解 (@ConditionalOnClass 等): 根据当前环境决定自动化配置是否生效

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

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

相关文章

前置代理重构网络访问的「中转站」

某跨境电商通过前置代理构建账号隔离体系&#xff0c;将亚马逊店铺关联风险降低85%&#xff1b;某企业利用前置代理过滤恶意流量&#xff0c;网络攻击拦截率提升70%。在复杂的网络环境中&#xff0c;前置代理作为客户端与目标服务器之间的「中间枢纽」&#xff0c;正成为跨境访…

乐鑫代理商飞睿科技,2025年AI智能语音助手市场发展趋势与乐鑫芯片解决方案分析

一、市场现状与技术背景进入2025年&#xff0c;AI智能语音助手市场呈现出爆发性增长态势。全球AI应用访问量从2024年初的36亿次激增至76亿次&#xff0c;增幅高达111%&#xff0c;其中语音交互类产品贡献了显著份额。在企业市场&#xff0c;语音技术已从“增值服务”转变为不可…

App爬虫工具篇-Appium安装

之前在另外一篇文章App爬虫工具篇-mitmproxy简单介绍了利用mitmproxy进行接口拦截来获取接口数据。但是很多软件现在都会对相关接口进行加密。如以下我用mitmproxy拦截到接口流量样例: {"raw_data": "EXMcAezXPq/MRC1m2mJIG/EQLisaahfpjPTj9svrxe6yLI8mZTvW4+…

容器与 Kubernetes 基本概念与架构

文章目录 1. 典型环境层次结构2. Kubernetes 生态三大类2.1 核心组件2.2 集群管理工具2.3 生态辅助工具2.4 资源管理关系 3. Docker 容器技术与实践3.1 镜像拉取加速3.2 认证与登录3.3 常用命令3.4 存储挂载方式对比3.5 docker-compose 启动3.6 容器化应用部署示例 4. kind 快速…

Ajax和Axios的初步学习

Ajax 一、什么是 Ajax&#xff1f; Ajax (Asynchronous JavaScript and XML) 是一种无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。通过在后台与服务器进行少量数据交换&#xff0c;Ajax 可以使网页实现异步更新。 主要特性&#xff1a; 异步性 (Asynch…

C#指针:解锁内存操作的底层密码

C#指针&#xff1a;解锁内存操作的底层密码 在 C# 的世界里&#xff0c;我们习惯了托管代码带来的安全与便捷 —— 垃圾回收器自动管理内存&#xff0c;类型系统严格检查数据操作&#xff0c;就像在精心维护的花园中漫步&#xff0c;无需担心杂草与荆棘。但当性能成为关键瓶颈…

永洪科技荣获商业智能品牌影响力奖,全力打造”AI+决策”引擎

近日&#xff0c;在备受业界瞩目的年度商业智能领域权威评选中&#xff0c;永洪科技凭借卓越的技术实力、深度的客户价值创造能力与前瞻的行业洞察&#xff0c;成功斩获“2025商业智能品牌影响力奖”。这一奖项不仅是对永洪科技市场地位与品牌声量的高度认可&#xff0c;更是对…

在SSM+vue项目中上传表单数据和文件

从前端向后端发送multipart/form-data 类型数据&#xff08;主要用于文件上传或表单提交&#xff09;如发送如下信息&#xff1a;前端代码vue文件&#xff1a;&#xff08;配置了服务器代理&#xff09;<template><div class"content"><el-form :mode…

Python 机器学习核心入门与实战进阶 Day 1 - 分类 vs 回归

✅ 今日目标 理解分类&#xff08;Classification&#xff09;与回归&#xff08;Regression&#xff09;的本质区别掌握两种任务的典型使用场景学会根据任务类型选择合适的模型了解每类模型对应的评估指标 &#x1f4d8; 一、监督学习的两大任务类型 任务类型输出结果典型问…

RPC--自定义注解注册发布服务

自定义的三个注解1、RpcReference这个注解用于修饰类的某个字段&#xff0c;表示这个字段是远程调用的引用下面详细解释下这个字段的定义Document表示这个注解应该被javadoc文档工具记录&#xff0c;生成API文档时使用了该注解的地方会被显示出来Retention表示这个注解的声明周…

Web 3D可视化引擎HOOPS Communicator,高效赋能工业级应用开发!

在数字化转型加速的今天&#xff0c;企业面临着前所未有的挑战——如何高效管理跨平台的设计数据、提升团队协作效率&#xff0c;并加快产品上市速度。HOOPS Communicator作为一款高性能的3D可视化与共享平台&#xff0c;凭借其强大的兼容性、先进的3D渲染引擎和无缝的协作功能…

OceanBase数据库迁移工具介绍和部署

OceanBase数据库迁移工具介绍和部署核心组件迁移支持部署要求单节点部署查看日志OceanBase 迁移服务&#xff08;OceanBase Migration Service, OMS&#xff09;是OceanBase数据库提供的一种支持同构或异构数据源与OceanBase数据库之间进行数据交互的服务&#xff0c;具备在线迁…

栈与队列:算法基础的核心差异

理解栈和队列的异同对打好算法基础太重要了&#xff01;它们都是编程和算法中无处不在的线性数据结构&#xff0c;核心区别在于操作数据的顺序。下面我来帮大家清晰梳理它们的异同点&#xff1a;一、相同点都是线性数据结构&#xff1a;数据元素之间逻辑上呈现“一个接一个”的…

HCIA-生成数协议(STP)

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 ​ 本篇笔记是根据B站上的视频教程整理而成&#xff0c;感谢UP主的精彩讲解&#xff01;如果需要了解更多细节&#xff0c;可以参考以下视频&#xf…

基于内网穿透技术的Stable+Diffusion+3.5本地化部署与远程图像生成架构

文章目录 前言1. 本地部署ComfyUI2. 下载 Stable Diffusion3.5 模型3. 演示文生图4. 公网使用Stable Diffusion 3.5 大模型4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 在数字内容创作行业中&#xff0c;利用本地化服务器进行人工智能部署的策略正逐步成为优化制作…

私有云平台实战-OpenStack入门体验

目录 #1.1云计算概述 1.1.1什么是云计算 1.1.2云计算的服务模型 1.1.3OpenStack概述 #2.1OpenStack一键部署 2.1.1在线安装 2.1.2使用本地仓库离线安装 2.1.3创建云主机 1.1云计算概述 云计算是一种基于互联网的计算方式&#xff0c;通过网络将共享的软硬件资源和信息按需提供…

专题:2025即时零售与各类人群消费行为洞察报告|附400+份报告PDF、原数据表汇总下载

原文链接&#xff1a;https://tecdat.cn/?p42808 即时零售的崛起正在重塑消费市场的时间与空间边界。从清晨的第一杯咖啡到深夜的应急零食&#xff0c;消费者的需求不再受限于传统营业时间。与此同时&#xff0c;不同人群的消费习惯呈现出鲜明差异&#xff0c;Z世代沉迷线上娱…

【一起来学AI大模型】算法核心:数组/哈希表/树/排序/动态规划(LeetCode精练)

以下是五大核心算法的重点解析和LeetCode经典题解&#xff0c;包含最优解法和模板代码&#xff1a;一、数组操作&#xff08;双指针/滑动窗口&#xff09;核心思想&#xff1a;通过索引指针高效遍历与操作数组1. 移动零&#xff08;No.283&#xff09;def moveZeroes(nums):slo…

CSS之基础语法一文全解析

CSS之基础语法一文全解析 一、CSS语法核心结构&#xff1a;选择器声明块1.1 基础语法模板1.2 关键组成部分 二、选择器全解析&#xff1a;精准定位目标元素2.1 基础选择器&#xff08;必掌握&#xff09;2.1.1 标签选择器&#xff08;类型选择器&#xff09;2.1.2 类选择器&…

vue 前端动态导入文件 import.meta.glob 导入图片

背景&#xff1a; 在开发过程中&#xff0c;前端会引入资源文件&#xff0c;这里主要是引入图片。在开发环境&#xff0c;导入的图片显示正常&#xff0c;但是打包部署后&#xff0c;导入的图片就不能正常显示。 原因分析&#xff0c;可能有如下几点&#xff1a; 1.图片不能显示…