从 @SpringBootApplication 出发,深度剖析 Spring Boot 自动装配原理

在 Spring Boot 的开发旅程中,@SpringBootApplication 注解堪称开启便捷开发之门的钥匙。它不仅是一个简单的注解,更是理解 Spring Boot 自动装配原理的重要入口。接下来,我们将以@SpringBootApplication 为切入点,深入探究 Spring Boot 自动装配的奥秘。

一、@SpringBootApplication 注解剖析

@SpringBootApplication 是一个组合注解,它由三个关键注解组成:@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan

1. @SpringBootConfiguration

@SpringBootConfiguration 本质上就是 @Configuration,用于标识该类是一个 Spring 配置类。这意味着被 @SpringBootApplication 标注的主应用类,具备定义 Bean 和配置 Spring 容器的能力。例如:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

这里的MyApplication 类因为 @SpringBootApplication 中的 @SpringBootConfiguration ,成为了整个应用的配置核心,我们可以在其中定义各种 Spring Bean。

2. @ComponentScan

@ComponentScan 用于告诉 Spring 去扫描指定包及其子包下的组件,将带有 @Component@Service@Repository@Controller 等注解的类注册为 Spring Bean。默认情况下,它会扫描主应用类所在包及其子包。例如,若主应用类 MyApplicationcom.example.demo 包下,那么 com.example.demo 及其所有子包中的符合条件的类都会被扫描并注册为 Bean。这使得我们的业务组件能够被 Spring 容器管理,从而方便地实现依赖注入等功能。

3. @EnableAutoConfiguration

@EnableAutoConfiguration 是自动装配的关键开启注解。它指示 Spring Boot 尝试根据项目的依赖自动配置 Spring 应用上下文。Spring Boot 通过 SpringFactoriesLoader 机制,从所有依赖的 jar 包的 META - INF/spring.factories 文件中加载与 EnableAutoConfiguration 关联的自动配置类。例如,在 spring - boot - autoconfigure 模块的 spring.factories 文件中,定义了众多自动配置类:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
# 此处省略大量其他自动配置类

这些自动配置类会根据应用的实际情况,有条件地参与到 Spring 容器的配置中。

二、Spring Boot 自动装配流程与 @SpringBootApplication 的关联

1. 启动应用触发自动装配

当我们运行 SpringApplication.run(MyApplication.class, args) 时,应用启动流程开始。由于 MyApplication 类被 @SpringBootApplication 注解,其中的 @EnableAutoConfiguration 会触发自动装配机制。SpringApplication 会利用 SpringFactoriesLoader 扫描所有依赖 jar 包中的 spring.factories 文件,收集与 EnableAutoConfiguration 对应的自动配置类。

2. 自动配置类的条件判断

收集到的自动配置类并非都会生效,它们需要通过各自的条件判断。自动配置类上广泛使用了 @Conditional 及其派生注解,如 @ConditionalOnClass@ConditionalOnProperty 等。以 DataSourceAutoConfiguration 为例,它可能有如下条件注解:

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {// 配置相关的方法和逻辑
}

@ConditionalOnClass(DataSource.class) 表示只有当类路径下存在 DataSource 类时,该自动配置类才会生效。这确保了只有在项目实际需要相关功能(例如使用数据库连接功能,才会有 DataSource 类在类路径中)时,对应的自动配置才会执行。

3. 自动配置类的执行与 Bean 注册

通过条件判断的自动配置类会被执行,其中定义的 @Bean 方法会向 Spring 容器注册相应的 Bean。比如 WebMvcAutoConfiguration 会注册与 Spring MVC 相关的一系列 Bean,像 RequestMappingHandlerMappingHandlerAdapter 等,这些 Bean 共同构建起 Spring MVC 的运行基础,使得应用具备处理 Web 请求的能力。

4. 用户自定义配置与自动配置的优先级

Spring Boot 保证用户自定义配置优先于自动配置。若开发者在应用中手动配置了与自动配置类相同类型的 Bean,那么自动配置的 Bean 不会生效。例如,若开发者自己定义了一个 DataSource Bean,DataSourceAutoConfiguration 中自动配置的 DataSource 就不会被注册到 Spring 容器中。这种优先级设置既发挥了自动装配的便利性,又赋予开发者对关键配置的控制权。

三、案例分析:以 Web 应用为例

假设我们要创建一个简单的 Spring Boot Web 应用。

1. 创建主应用类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class WebAppApplication {public static void main(String[] args) {SpringApplication.run(WebAppApplication.class, args);}
}

这里 @SpringBootApplication 开启了自动配置、组件扫描等功能。

2. 引入 Web 相关依赖

pom.xml 中引入 spring - boot - starter - web 依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring - boot - starter - web</artifactId>
</dependency>

该依赖会触发 WebMvcAutoConfiguration 等自动配置类。

3. 自动配置过程

  • spring - boot - starter - web 依赖引入了 Spring Web 相关的类,使得 WebMvcAutoConfiguration 的条件注解通过。
  • WebMvcAutoConfiguration 开始执行,向 Spring 容器注册 RequestMappingHandlerMapping,用于处理请求映射;注册 HandlerAdapter,用于调用合适的处理器处理请求等。最终,应用具备了处理 Web 请求的完整能力。

四、总结

@SpringBootApplication 作为 Spring Boot 开发的核心注解,串联起了组件扫描和自动装配等关键功能。深入理解它与自动装配原理的关系,能帮助开发者更好地掌控 Spring Boot 应用的配置与运行机制。在实际开发中,你是否利用 @SpringBootApplication 的特性解决过复杂的配置问题?欢迎在评论区分享你的经验,让我们共同探索 Spring Boot 的更多奥秘。

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

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

相关文章

MySQL面试专题

1.什么是BufferPool&#xff1f; Buffer Pool基本概念 Buffer Pool&#xff1a;缓冲池&#xff0c;简称BP。其作用是用来缓存表数据与索引数据&#xff0c;减少磁盘IO操作&#xff0c;提升效率。 Buffer Pool由缓存数据页(Page) 和 对缓存数据页进行描述的控制块 组成, 控制…

调用百度api实现语音识别(python)

该代码实现了一个企业级的语音识别解决方案,通过调用百度语音识别API,实现实时录音识别和对已有音频语音识别功能。 百度智能云:请自行访问百度智能云,开通免费的语音识别功能,获取API_KEY和SECRET_KEY。操作按照百度流程即可,可免费申请。 首先,配置下百度API和描述下错…

KRaft模式

目录标题 Kraft模式**1. 什么是Kraft模式&#xff1f;****2. 为什么引入Kraft模式&#xff1f;****3. 核心优势****4. 架构与工作原理****5. 部署与配置要点****6. 适用场景与最佳实践****总结**KIP-833: Mark KRaft as Production Ready除了Kraft模式&#xff0c;Kafka还有以下…

单片机电路中常见的英文术语及缩写

以下是单片机电路中常见的英文术语及缩写的解释及其作用说明&#xff0c;按功能分类整理&#xff0c;便于理解&#xff1a; 一、核心术语 MCU (Microcontroller Unit) • 中文&#xff1a;微控制器单元 • 作用&#xff1a;单片机的核心芯片&#xff0c;集成CPU、存储器、外设接…

常见框架漏洞之一:Thinkphp5x

ThinkPHP是为了简化企业级应⽤开发和敏捷WEB应⽤开发⽽诞⽣的&#xff0c;是⼀个快速、兼容⽽且简单的轻量级国产PHP开发框架&#xff0c;诞⽣于2006年初&#xff0c;原名FCS&#xff0c;2007年元旦正式更名为 ThinkPHP&#xff0c;遵循Apache2开源协议发布&#xff0c;从Stru…

2025年优化算法:龙卷风优化算法(Tornado optimizer with Coriolis force,TOC)

龙卷风优化算法&#xff08;Tornado optimizer with Coriolis force&#xff09;是发表在中科院二区期刊“ARTIFICIAL INTELLIGENCE REVIEW”&#xff08;IF&#xff1a;11.7&#xff09;的2025年智能优化算法 01.引言 当自然界的狂暴之力&#xff0c;化身数字世界的智慧引擎&…

面试中如何回答性能优化的问题

性能问题和Bug不同,后者的分析和解决思路更清晰,很多时候从应用日志(文中的应用指分布式服务下的单个节点)即可直接找到问题根源,而性能问题,其排查思路更为复杂一些。 对应用进行性能优化,是一个系统性的工程,对工程师的技术广度和技术深度都有所要求。一个简单的应用…

CMake 函数和宏

CMake 函数 CMake 函数定义语法如下, 其中 name 为函数名, <arg1> 为参数名, <commands> 为函数体. 函数定义后, 可以通过 name 调用函数. 函数名允许字母数字下划线, 不区分大小写. function(name [<arg1> ...])<commands> endfunction()如下的样例…

【QA】Qt有哪些迭代器模式的应用?

在 Qt/C 中&#xff0c;迭代器模式的设计主要分为 标准 C 风格 和 Qt 框架特有风格&#xff0c;以下结合代码详细说明两种实现方式的关键设计及其应用场景&#xff1a; 一、Qt 框架中的迭代器模式设计 Qt 提供了两种迭代器风格&#xff1a;Java 风格&#xff08;显式迭代器&am…

Mysql表的简单操作

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 3.1 创建表 3.2 查看表结构 3.3 修改表 1. 添加字段 2. 修改字段 3…

【云馨AI-大模型】自动化部署Dify 1.1.2,无需科学上网,Linux环境轻松实现,附Docker离线安装等

Dify介绍 官网&#xff1a;https://dify.ai/zh生成式 AI 应用创新引擎开源的 LLM 应用开发平台。提供从 Agent 构建到 AI workflow 编排、RAG 检索、模型管理等能力&#xff0c;轻松构建和运营生成式 AI 原生应用。 Dify安装脚本 目录创建 mkdir -p /data/yunxinai &&a…

WordPress上传图片时显示“未提供数据”错误

在WordPress中上传图片时显示“未提供数据”的错误&#xff0c;通常是由多种原因引起的&#xff0c;以下是一些常见的问题及其解决方法&#xff1a; 1. 文件权限问题 WordPress需要正确的文件和目录权限才能正常上传图片。如果权限设置不正确&#xff0c;可能会导致无法上传图…

python3面试题20个(python web篇)

更多内容请见: python3案例和总结-专栏介绍和目录 文章目录 1.python asyncio的原理?2.对Flask蓝图(Blueprint)的理解?3.Flask 和 Django 路由映射的区别?4.什么是wsgi,uwsgi,uWSGI?5.Django、Flask、Tornado的对比?6.CORS 和 CSRF的区别?7.Session,Cookie,JWT的理解8.简…

RedisTemplate和RedissonClient适用的场景有什么不同

在 Spring Boot 项目中&#xff0c;RedisTemplate 和 RedissonClient 分别针对不同的使用场景设计&#xff0c;以下是它们的核心区别和适用场景分析&#xff1a; 一、RedisTemplate&#xff08;Spring Data Redis&#xff09; 定位 Spring 官方提供的 Redis 操作工具&#xf…

人脸表情识别系统分享(基于深度学习+OpenCV+PyQt5)

最近终于把毕业大论文忙完了&#xff0c;众所周知硕士大论文需要有三个工作点&#xff0c;表情识别领域的第三个工作点一般是做一个表情识别系统出来&#xff0c;如下图所示。 这里分享一下这个表情识别系统&#xff1a; 采用 深度学习OpenCVPyQt5 构建&#xff0c;主要功能包…

GitHub供应链攻击事件:Coinbase遭袭,218个仓库暴露,CI/CD密钥泄露

此次供应链攻击涉及GitHub Action "tj-actions/changed-files"&#xff0c;最初是针对Coinbase的一个开源项目的高度定向攻击&#xff0c;随后演变为范围更广的威胁。 攻击过程与影响 Palo Alto Networks Unit 42在一份报告中指出&#xff1a;“攻击载荷主要针对其…

Redis 核心源码解析:从设计哲学到企业级应用实践

一、Redis 的核心设计哲学 Redis 的成功源于其 「用内存换时间」 的核心理念&#xff0c;围绕以下三个核心原则构建&#xff1a; 极简主义&#xff1a;单线程模型避免锁竞争&#xff0c;代码保持高度内聚。 性能至上&#xff1a;所有数据常驻内存&#xff0c;网络层采用事件驱…

GZCTF平台搭建及题目上传

前言 我用手里的Ubuntu虚拟机搭建的&#xff0c;大家根据自己的实际情况来吧 安装及部署 首先&#xff0c;你的虚拟机需要有Docker和Docker-Compose&#xff0c;前者可以看我之前的文章&#xff0c;另外一个可以输入下面的命令安装&#xff0c;注意先获取管理员权限&#xff…

Pycharm社区版创建Flask项目详解

一、创建工程项目 二、配置工程目录 新建的空项目下创建目录。 1、新建app.py文件 2、app.py代码如下&#xff1a; from flask import Flask, render_templateapp Flask(__name__)app.route("/") def root():"""主页:return: Index.html"&qu…

CentOS 7 64位安装Docker

以下是在已有的 CentOS 7 64 位虚拟机上安装 Docker 并配置华为镜像源的详细步骤&#xff1a; 1. 备份原有 Yum 源&#xff08;可选&#xff0c;建议操作&#xff09; # 备份原有仓库文件 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backu…