Spring @EnableAutoConfiguration 注解执行过程详解

news2025/3/31 15:33:24

Spring @EnableAutoConfiguration 注解执行过程详解


核心流程
  1. 触发自动配置:通过 @EnableAutoConfiguration 注解开启自动配置。
  2. 加载配置类:根据 META-INF/spring.factories 文件加载默认的自动配置类。
  3. 条件判断:每个自动配置类通过 @Conditional 注解判断是否生效。
  4. Bean 注册:符合条件的配置类会注册对应的 Bean。

代码示例
1. 主启动类(触发自动配置)
// 主类添加 @SpringBootApplication 注解(包含 @EnableAutoConfiguration)
@SpringBootApplication // 等效于 @Configuration + @EnableAutoConfiguration + @ComponentScan
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
2. 自动配置类示例(模拟 Spring Boot 内部机制)
// 1. 自动配置类(模拟 spring-boot-autoconfigure 中的配置)
@Configuration
@ConditionalOnClass(DataSource.class) // 仅当存在 DataSource 类时生效
@ConditionalOnProperty(prefix = "app", name = "enabled", havingValue = "true") // 需配置 app.enabled=true
public class MyAutoConfiguration {
    
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

// 2. 自定义条件类(扩展条件判断)
public class CustomCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        // 自定义条件逻辑(例如检查环境变量)
        return System.getenv("CUSTOM_ENV") != null;
    }
}
3. 配置文件(application.properties
# 激活自动配置
app.enabled=true
4. 测试类
@SpringBootTest
public class DemoApplicationTests {
    @Autowired
    private MyBean myBean;

    @Test
    public void testAutoConfiguration() {
        assertNotNull(myBean); // 验证 Bean 是否被正确注册
    }
}

执行过程分步说明
步骤 1:注解触发
  • @SpringBootApplication 内部包含 @EnableAutoConfiguration
  • @EnableAutoConfiguration 通过 @Import(AutoConfigurationImportSelector.class) 引入配置选择器。
步骤 2:加载配置类
  • AutoConfigurationImportSelector 读取 META-INF/spring.factories 文件:

    # spring.factories(示例内容)
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.example.MyAutoConfiguration,\
    org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
    
  • 该文件列出了所有需要加载的自动配置类。

步骤 3:条件判断
  • 每个配置类通过 @Conditional 注解判断是否生效:
    • @ConditionalOnClass(DataSource.class):检查类路径是否存在 DataSource 类。
    • @ConditionalOnProperty:检查配置文件是否设置 app.enabled=true
    • 自定义条件 @Conditional:如 @Conditional(CustomCondition.class)
步骤 4:Bean 注册
  • 满足条件的配置类会执行 @Bean 方法,将 Bean 注册到 Spring 容器。

关键类与注解说明
组件作用示例代码
@EnableAutoConfiguration触发自动配置,加载 spring.factories 中的配置类。@SpringBootApplication(包含该注解)
spring.factories配置文件,列出所有需要加载的自动配置类。EnableAutoConfiguration=com.example.MyAutoConfiguration
@Conditional 注解条件判断注解,决定配置类是否生效。@ConditionalOnClass, @ConditionalOnProperty, @ConditionalOnMissingBean
AutoConfigurationImportSelector核心选择器,解析 spring.factories 并过滤符合条件的配置类。ImportSelector 接口实现类
Condition 接口自定义条件判断逻辑(如环境变量、类存在性等)。CustomCondition implements Condition

执行流程图
启动类 @SpringBootApplication
├─ 触发 @EnableAutoConfiguration
│  ├─ 调用 AutoConfigurationImportSelector
│  │  ├─ 读取 META-INF/spring.factories
│  │  │  └─ 加载所有配置类(如 MyAutoConfiguration)
│  │  ├─ 遍历配置类,执行条件判断(@Conditional)
│  │  │  ├─ 若条件满足 → 注册 Bean
│  │  │  └─ 否则 → 跳过
│  │  └─ 返回符合条件的配置类集合
│  └─ 将配置类注册到 Spring 容器
└─ 完成自动配置

总结表格
阶段关键步骤核心组件/注解
触发阶段通过 @EnableAutoConfiguration 启动自动配置流程。@SpringBootApplication, @EnableAutoConfiguration
配置加载阶段META-INF/spring.factories 文件加载所有配置类。spring.factories, AutoConfigurationImportSelector
条件判断阶段根据 @Conditional 注解过滤符合条件的配置类。@ConditionalOnClass, @ConditionalOnProperty, @Conditional
Bean 注册阶段将符合条件的配置类中的 Bean 注册到 Spring 容器。@Configuration, @Bean

关键点补充
  1. spring.factories 位置:通常位于依赖库的 META-INF 目录下(如 spring-boot-autoconfigure 依赖)。
  2. 条件注解组合:可组合多个 @Conditional 注解,如 @ConditionalOnClass + @ConditionalOnProperty
  3. 禁用自动配置:通过 @EnableAutoConfiguration(exclude = {DisabledConfig.class}) 排除特定配置。

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

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

相关文章

JavaScript中的Math对象和随机数

目录 一、常用数学方法 1. 数值处理 2. 极值与运算 3. 三角函数(参数为弧度) 4. 对数与指数 5. 常量 二、随机数生成 Math.random() 1. 基础范围控制 2. 整数随机数 三、实际应用场景 1. 随机颜色生成 2. 数组随机排序 3. 概率控制 四、注…

lxd-dashboard 图形管理LXD/LXC

前言 LXD-WEBGUI是一个完全用AngularJS编写的Web应用程序,无需应用服务器、数据库或其他后端服务支持。只需要简单地托管静态HTML和JavaScript文件,就能立即投入使用。这个项目目前处于测试阶段,提供了直观的用户界面,帮助用户便捷地管理和控制LXD实例。 安装lxd-dashboa…

python纯终端实现图片查看器(全彩)(windows)

很多人作为命令行爱好者,无法在终端内直接查看图片是无法忍受的, 那就写一个! 先直接上代码 import os import sys from PIL import Image import numpy as np import colorama import msvcrt # Windows专用# 初始化colorama colorama.ini…

【动态规划篇】- 路径问题

62. 不同路径 题目链接: 62. 不同路径 题目解析: 状态表示 dp[i][j]表示:以[i][j]为终点时,一共有多少种路径。 状态转移方程 以[i][j]最近的几步来分析问题,要么从[i-1][j]位置向下走一步到达[i][j],要么从[i][j-1…

《新凯来:半导体设备制造领域的“国家队”》

《新凯来:半导体设备制造领域的“国家队”》 一、SEMICON China 爆火出圈:31 款设备背后的 “深圳力量” 1.1 展会现象级热度 在 2025 年 SEMICON China 展会现场,新凯来展台成了整届展会当之无愧的 “顶流”,被来自全球各地的专…

AI大模型最新发布[update@202503]

OpenAI GPT-4o:多模态,“o”代表Omni,即全能的意思,凸显了其多功能的特性。 多模态交互,GPT-4o可以接受文本、音频和图像的任意组合作为输入,并生成文本、音频和图像的任意组合输出。实时推理能力&#x…

深入浅出 Embedding

1. 什么是 Embedding? Embedding(嵌入)是一种将高维数据映射到低维连续空间的技术,用于表达数据的语义关系。简单来说,它是一种向量化表示,将文本、图像、用户行为等信息转换为数值向量,使得相似的数据在向量空间中距离更近。 2. 如何理解 Embedding? 2.1 浅显易懂的…

java项目之基于ssm的乡镇自来水收费系统(源码+文档)

项目简介 乡镇自来水收费系统实现了以下功能: 乡镇自来水收费系统在Eclipse环境中,使用Java语言进行编码,使用Mysql创建数据表保存本系统产生的数据。系统可以提供信息显示和相应服务,其管理员管理水表,审核用户更换…

Spring AI MCP 架构详解

Spring AI MCP 架构详解 1.什么是MCP? MCP 是一种开放协议,它对应用程序向大语言模型(LLMs)提供上下文信息的方式进行了标准化。可以把 MCP 想象成人工智能应用程序的 USB-C 接口。就像 USB-C 为将设备连接到各种外围设备和配件提供了一种…

目标识别与双目测距(1)环境搭建:Ubuntu+yolov5+pcl库

环境情况 ubuntu 18.04 → 20.04(最终) 安装Ubuntu1804虚拟机系统 Anaconda:可参考我的另一篇文章 Python 3.6.13 → 3.8(最终)Anaconda3-2021.05 目标识别:YOLOv5相关 1、安装git sudo apt install gi…

OpenAI API - Agent

文章目录 代理概述模型工具知识与记忆防护栏编排入门 语音代理选择正确的架构语音到语音(多模态)架构链式架构 构建语音代理使用语音到语音架构进行实时处理将音频输入链接到文本处理 → 音频输出 代理 了解如何使用 OpenAI API 构建代理。 https://pl…

Strawberry perl的下载,查询版本号,配置Path环境变量,查找perl解释器的位置

Strawberry Perl 是一个适用于 Microsoft Windows 的 Perl 环境,包含运行和开发 Perl 应用程序所需的一切。它旨在尽可能接近 UNIX 系统上的 Perl 环境。 下载 官网: Strawberry Perl for Windows - Releases 各个版本: Strawberry Perl for Windows - Releases …

MySQL的基础语法2(函数-字符串函数、数值函数、日期函数和流程函数 )

目录 一、字符串函数 1.常见字符串函数 ​编辑 2.字符串函数的基本使用 3.字符串函数的数据库案例演示 二、数值函数 1.常见数值函数(如下): 2.数值函数的基本使用 3.数值函数的数据库案例演示 三、日期函数 1.常见的日期函数 2.日…

5G_WiFi_CE_杂散测试

目录 一、规范要求 1、法规目录: 2、限值: (1)带外发射杂散 (2)带内发射杂散 (3)接收杂散 二、测试方法 1、带外发射杂散 (1)测试条件 &#xff08…

大数据Spark(五十五):Spark框架及特点

文章目录 Spark框架及特点 一、Spark框架介绍 二、Spark计算框架具备以下特点 Spark框架及特点 一、Spark框架介绍 Apache Spark 是一个专为大规模数据处理而设计的快速、通用的计算引擎。最初由加州大学伯克利分校的 AMP 实验室(Algorithms, Machines, and Pe…

UI产品经理基础(六):如何解决用户的质疑?

在需求调查中遇到用户质疑“不专业”或“不了解需求”,本质上是用户对产品经理的信任缺失或沟通鸿沟导致的。要化解这种质疑,需从专业能力展示、沟通方式优化、用户参与感提升三个维度切入,结合具体场景采取针对性策略。以下是系统化的解决方…

【大数据技术】大数据技术概念及概述

1. 大数据概念 数据 是实时或观察的结果是对客观事务的逻辑归纳是用于表示客观事物的未经加工的原始素材 数据的产生 对客观事务的计量和记录尝试的数据 单位换算1 byte8 bit1 k1024 byte1 mb1024 k1 g1024 m1 t1024 g1 p1024 t1 e1024 p1 z1024 e1 y1024 z1 b1024 y1 n10…

Python库()

1.概念 Matplotlib 库:是一款用于数据可视化的 Python 软件包,支持跨平台运行,它能够根据 NumPy ndarray 数组来绘制 2D 图像,它使用简单、代码清晰易懂 Matplotlib 图形组成: Figure:指整个图形&#xf…

AI知识补全(八):多模态大模型是什么?

名人说:人生如逆旅,我亦是行人。 ——苏轼《临江仙送钱穆父》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:AI知识补全(七):AI Agent 智能…