從 @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.pswp.cn/bicheng/74423.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74423.shtml
英文地址,請注明出處:http://en.pswp.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…