当前位置: 首页 > article >正文

从 @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 的更多奥秘。

相关文章:

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

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

使用vue3和vue-router实现动态添加和删除cachedViews数组

以下是一个使用 Vue 3 和 Vue Router 实现动态添加和删除 cachedViews 数组的代码示例&#xff0c;该示例结合 keep-alive 组件来动态控制路由组件的缓存。 src/ ├── App.vue ├── router/ │ └── index.js ├── views/ │ ├── Home.vue │ ├── About.v…...

vue 点击放大,图片预览效果

背景&#xff1a; 在使用vue框架element组件的背景下&#xff0c;我们对图片的展示需要点击放大(单张)&#xff1b;如果是多张图片&#xff0c;要支持左右滑动查看多张图片(多张)。 单张图片放大&#xff0c;el-image图片组件&#xff0c;或者原生的img标签。 多张图片放大&…...

如何使用Xshell连接Linux虚拟机

在日常开发和运维工作中&#xff0c;远程连接Linux服务器或虚拟机是一项基本技能。Xshell 是一款功能强大的终端模拟器&#xff0c;支持通过 SSH 协议远程连接 Linux 系统。本文将详细介绍如何使用 Xshell 连接 Linux 虚拟机。准备工作 在开始之前&#xff0c;请确保你已经完成…...

笛卡尔轨迹规划之齐次变换矩阵与欧拉角、四元数的转化

一、笛卡尔轨迹规划需求 笛卡尔轨迹规划本质就是我们对机械臂的末端位置和姿态进行规划&#xff0c;其实也就是对末端坐标系的位姿进行规划。我们清楚末端坐标系的位姿是可以用齐次变换矩阵T来表示的&#xff0c;但这样表示的话&#xff0c;并不利于我们去做规划&#xff0c;所…...

1 存储过程学习: 使用DMSQL程序的优点

DMSQL程序具有以下优点&#xff1a; 与SQL语言的完美结合 SQL语言已成为数据库的标准语言&#xff0c;DMSQL程序支持所有SQL数据类型和所有SQL函数&#xff0c;同时支持所有DM对象类型。在DMSQL程序中可以使用SELECT、INSERT、DELETE、UPDATE数据操作语句&#xff0c;事务控制…...

NPU上如何使能pytorch图模式

1 Pytorch的compile技术 PyTorch 的 torch.compile 是一个强大的功能&#xff0c;用于优化 PyTorch 模型的性能。它通过将 PyTorch 的动态图转换为静态图&#xff0c;并利用 Just-In-Time&#xff08;JIT&#xff09;编译技术&#xff0c;显著提高模型的推理速度和训练效率。 …...

进制转换(c++)

由于进制转换属于基础且比较重要&#xff0c;所以我就写一个博客方便自己复习&#xff0c;过程中如有错误&#xff0c;还请指出。 常用的进制有二进制&#xff0c;八进制&#xff0c;十进制和十六进制。 常用的进制转换就是十进制转换成其他进制和其他进制转换成十进制 我们先…...

2025-03-24 学习记录--C/C++-PTA 习题7-7 字符串替换

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 习题7-7 字符串替换 本题要求编写程序&#xff0c;将给定字符串中的大写英文字母按以下对应规则替换&#…...

为什么TCP需要三次握手?一次不行吗?

文章目录 1. 三次握手的过程2. 为什么需要三次握手&#xff1f;3. 握手过程中每一步的具体作用4. 简单比喻5. 为什么是三次握手&#xff0c;而不是两次或四次&#xff1f;6. 三次握手中的序列号有什么作用&#xff1f;7. 总结 1. 三次握手的过程 三次握手是建立 TCP 连接的过程…...

具身系列——NLP工程师切入机器人和具身智能方向

职位高频词汇&#xff1a;VLM调优经验、核心算法&#xff08;Diffusion、RL、VIT&#xff09;、pytorch、仿真环境&#xff08;Isaac Gym、Mujoco、webots&#xff09; 基于当前具身智能行业发展趋势和岗位需求&#xff0c;以下是为NLP工程师设计的转型路径与策略&#xff0c;…...

SpringBoot2集成Elasticsearch8(使用spring-boot-starter-data-elasticsearch)

写在前面 使用spring-boot-starter-data-elasticsearch集成Elasticsearch8&#xff1f; What? 官方写的不支持啊&#xff1f;让我们来看下官方给出的版本建议。 官方地址&#xff1a; https://docs.spring.io/spring-data/elasticsearch/reference/elasticsearch/versions.…...

【平台优化】持续调度参数在高负载大集群中的影响

持续调度参数在高负载大集群中的影响 背景介绍2种调度通信方式对集群的影响社区相关的讨论结论 背景介绍 这几年经历了我们大数据的Yarn集群的几次扩容&#xff0c;集群从原先的800多台增加到1300多台到现在的1600多台&#xff0c;在集群规模不断增加的过程中&#xff0c;有遇…...

军事级加密通信系统——基于QML的战术地图加密传输

目录 基于QML的战术地图加密传输一、引言二、理论背景与安全需求2.1 战术地图数据的敏感性与安全性要求2.2 QML与PyQt5集成优势2.3 加密算法与数据传输模型三、系统架构与数据流图四、QML前端界面设计与交互功能4.1 QML界面优势与设计理念4.2 功能要求4.3 QML文件示例五、加密传…...

ElasticSearch 可观测性最佳实践

ElasticSearch 概述 ElasticSearch 是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理 PB 级别&#xff08;大数据时代&#xff09;的数据。ES 也使用 Java 开…...

(一)飞行器的姿态欧拉角, 欧拉旋转, 完全数学推导(基于坐标基的变换矩阵).(偏航角,俯仰角,横滚角)

(这篇写的全是基矢变换矩阵)不是坐标变换矩阵,坐标变换矩阵的话转置一下,之后会有推导. 是通过M转置变换到P撇点....

基于Spring Boot + Vue的银行管理系统设计与实现

基于Spring Boot Vue的银行管理系统设计与实现 一、引言 随着金融数字化进程加速&#xff0c;传统银行业务向线上化转型成为必然趋势。本文设计并实现了一套基于Spring Boot Vue的银行管理系统&#xff0c;通过模块化架构满足用户、银行职员、管理员三类角色的核心业务需求…...

数据库基础知识点(系列一)

1&#xff0e;数据库的发展历史分哪几个阶段&#xff1f;各有什么特点&#xff1f; 答&#xff1a;数据库技术经历了人工管理阶段、文件系统阶段和数据库系统三个阶段。 1&#xff09;人工管理阶段 这个时期数据管理的特点是&#xff1a; 数据由计算或处理它的程序自行携带…...

Android Compose 层叠布局(ZStack、Surface)源码深度剖析(十三)

Android Compose 层叠布局&#xff08;ZStack、Surface&#xff09;源码深度剖析 一、引言 在 Android 应用开发领域&#xff0c;用户界面&#xff08;UI&#xff09;的设计与实现一直是至关重要的环节。随着技术的不断演进&#xff0c;Android Compose 作为一种全新的声明式…...

JVM常用概念之身份哈希码

问题 当我们调用Object.hashCode时&#xff0c;如果没有用户没有提供哈希码&#xff0c;会发生什么&#xff1f; System.identityHashCode如何工作&#xff1f;它是否获取对象地址&#xff1f; 基础知识 在 Java 中&#xff0c;每个对象都有equals和hashCode &#xff0c;即…...

vue 对接 paypal 订阅和支付

一个是支付一个是订阅&#xff0c;写的时候尝试把他们放到一个里面&#xff0c;但是会报错&#xff0c;所以分开写了 我们的页面&#xff0c;前三个为订阅最后一个是支付&#xff0c;我把他们放到一个数组里面循环展示的&#xff0c;所以我们判断的时候只要判断id是否为4&#…...

Spring Boot - 动态编译 Java 类并实现热加载

为什么需要动态编译&#xff1f; 想象这样一个场景&#xff1a;你的系统需要实时更新业务规则&#xff0c;但重启服务会导致用户体验中断&#xff1b;或者你正在开发一款低代码平台&#xff0c;允许用户编写自定义逻辑并即时生效。这时&#xff0c;动态编译并加载 Java 类的能…...

基于javaweb的SpringBoot实习管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...

流影---开源网络流量分析平台(一)(小白超详细)

目录 流影介绍 一、技术架构与核心技术 二、核心功能与特性 流影部署 流影介绍 一、技术架构与核心技术 模块化引擎设计 流影采用四层模块化架构&#xff1a;流量探针&#xff08;数据采集&#xff09;、网络行为分析引擎&#xff08;特征提取&#xff09;、威胁检测引擎&…...

Spring Boot事件机制详解

Spring Boot事件机制详解 1. 事件机制基础 1.1 什么是事件驱动架构 事件驱动架构(Event-Driven Architecture, EDA)是一种软件设计模式&#xff0c;其中系统组件通过事件的发布与订阅进行通信。在Spring Boot中&#xff0c;事件机制为应用程序提供了松耦合的组件间通信方式&…...

【商城实战(63)】配送区域与运费设置全解析

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…...

2025高频面试算法总结篇【字符串】

文章目录 直接刷题链接直达无重复字符的最长子串给定一个数&#xff0c;删除K位得到最小值至多包含 K 个不同字符的最长子串字符串的排列至少有K个重复字符的最长子串 直接刷题链接直达 如何找出一个字符串中的最大不重复子串 3. 无重复字符的最长子串 给定一个数&#xff0…...

Python散点密度图(Scatter Density Plot):数据可视化的强大工具

在数据驱动决策的时代,能够高效地处理和可视化多变量数据是一项 crucial 的技能。今天,我们就来深入探讨散点密度图(Scatter Density Plot),这是一种将散点图和核密度估计相结合的数据可视化技术,主要用于展示大量数据点在二维平面上的分布情况。 一、散点密度图的特点 …...

Oracle 数据库安全评估(DBSAT)简明过程

下载DBSAT 从这里下载。 实际是从MOS中下载&#xff0c;即&#xff1a;Oracle Database Security Assessment Tool (DBSAT) (Doc ID 2138254.1)。 最新版本为3.1.0 (July 2024)&#xff0c;名为dbsat.zip&#xff0c;近45MB。 $ ls -lh dbsat.zip -rw-rw-r-- 1 oracle oins…...

【T2I】Divide Bind Your Attention for Improved Generative Semantic Nursing

CODE: GitHub - boschresearch/Divide-and-Bind: Official implementation of "Divide & Bind Your Attention for Improved Generative Semantic Nursing" (BMVC 2023 Oral) ABSTRACT 新兴的大规模文本到图像生成模型&#xff0c;如稳定扩散(SD)&#xff0c;已…...