Spring Boot 核心注解全解:@SpringBootApplication背后的三劍客

大家好呀!👋 今天我們要聊一個超級重要的Spring Boot話題 - 那個神奇的主類注解@SpringBootApplication!很多小伙伴可能每天都在用Spring Boot開發項目,但你真的了解這個注解背后的秘密嗎?🤔

別擔心,今天我就用最通俗易懂的方式,帶大家徹底搞懂這個"三合一"的超級注解!保證連小學生都能聽懂!🎯 文章會很長很詳細,但絕對值得你花時間看完!💪

一、先來認識下主角:@SpringBootApplication

每次我們創建一個Spring Boot項目,都會在主類上看到這個注解:

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

看起來很簡單對吧?但你知道嗎,這個注解其實是個"三合一"的超級注解!🦸?♂? 它由三個核心注解組合而成:

  1. @SpringBootConfiguration - 配置擔當
  2. @EnableAutoConfiguration - 自動裝配擔當
  3. @ComponentScan - 組件掃描擔當

接下來我們就一個個拆解,看看它們各自有什么本領!🔍

二、第一劍客:@SpringBootConfiguration

1. 基本介紹

@SpringBootConfiguration是Spring Boot特有的配置注解,它實際上是@Configuration注解的"加強版"💪。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {@AliasFor(annotation = Configuration.class)boolean proxyBeanMethods() default true;
}

從代碼可以看出,它本質上就是一個@Configuration,但加上了Spring Boot的特殊標識。

2. 它能做什么?

  • 標識配置類:告訴Spring"這是一個配置類,里面有Bean的定義哦!"📝
  • 定義Bean:可以在類里用@Bean注解定義各種組件
  • 替代XML配置:以前用XML配置的Bean,現在可以用Java代碼來配置了

3. 實際使用示例

@SpringBootConfiguration
public class MyConfig {@Beanpublic MyService myService() {return new MyServiceImpl();}@Beanpublic DataSource dataSource() {// 配置數據源return new HikariDataSource();}
}

4. 與@Configuration的區別

雖然功能相同,但@SpringBootConfiguration有特殊含義:

  • 它通常只用于主配置類(就是有main方法的那個類)
  • Spring Boot在內部處理時會特殊對待它
  • 一般項目中建議還是用@Configuration,除非是主類

5. 小測驗

? 問題:如果一個類被@SpringBootConfiguration標注,Spring會怎么處理它?
💡 答案:Spring會把它當作配置類處理,掃描其中的@Bean方法,并將返回的對象注冊為Spring容器中的Bean。

三、第二劍客:@EnableAutoConfiguration

這是三個劍客中最強大也最神奇的一個!? 它開啟了Spring Boot的"自動裝配"魔法!

1. 自動裝配是什么?

想象你去吃自助餐🍽?:

  • 傳統Spring:你需要自己點每道菜(手動配置每個Bean)
  • Spring Boot:看到你走進來,就自動把你可能喜歡的菜都端上來了(自動配置)

這就是自動裝配的魅力!它根據你添加的依賴,自動配置Spring應用。

2. 工作原理揭秘

@EnableAutoConfiguration背后的魔法是這樣實現的:

  1. 讀取META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件:這個文件里列出了所有自動配置類
  2. 條件過濾:根據當前環境(類路徑、已有Bean等)過濾掉不適用的配置
  3. 應用配置:將符合條件的配置類加載進來

3. 自動配置示例

舉個例子🌰:

  • 你在pom.xml中添加了spring-boot-starter-data-jpa
  • Spring Boot看到后:“哦!你需要JPA支持!”
  • 自動配置數據源、EntityManager等JPA相關Bean

4. 查看自動配置報告

想知道哪些自動配置生效了?可以這樣查看:

在application.properties中添加:

debug=true

啟動時會打印類似這樣的報告:

=========================
AUTO-CONFIGURATION REPORT
=========================Positive matches:
-----------------DataSourceAutoConfiguration matched:- @ConditionalOnClass found org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType (OnClassCondition)Negative matches:
-----------------ActiveMQAutoConfiguration:Did not match:- @ConditionalOnClass did not find required class 'javax.jms.ConnectionFactory' (OnClassCondition)

5. 自定義自動配置

你也可以創建自己的自動配置!步驟:

  1. 創建META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件
  2. 寫入你的配置類全限定名
  3. 使用@Conditional系列注解控制條件

6. 排除自動配置

如果不想要某些自動配置,可以排除它們:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {// ...
}

或者在配置文件中:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

7. 小測驗

? 問題:為什么我們加了spring-boot-starter-web依賴后,Tomcat就自動啟動了?
💡 答案:因為@EnableAutoConfiguration檢測到類路徑下有Servlet相關的類,自動加載了Tomcat的配置。

四、第三劍客:@ComponentScan

1. 組件掃描是什么?

@ComponentScan就像Spring的"雷達"📡,它會掃描指定包及其子包下的組件(被@Component@Service@Repository等注解的類),并把它們注冊為Spring Bean。

2. 默認行為

@SpringBootApplication中,如果沒有指定掃描路徑:

  • 默認掃描主類所在包及其子包
  • 這也是為什么我們通常把主類放在項目最外層包

3. 自定義掃描路徑

如果你想掃描其他包,可以這樣:

@SpringBootApplication
@ComponentScan({"com.myapp", "com.shared"})
public class MyApplication {// ...
}

4. 過濾組件

你可以包含或排除特定組件:

@ComponentScan(basePackages = "com.myapp",excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.myapp.test.*")
)

5. 與XML配置的對比

以前在XML中是這樣配置組件掃描的:


現在用注解更加簡潔方便!

6. 實際應用技巧

  • 組織包結構:合理組織包結構,讓掃描更高效
  • 避免全盤掃描:不要掃描不必要的包(如第三方jar包)
  • 多模塊項目:在多模塊項目中,注意主類的位置

7. 小測驗

? 問題:如果把主類放在com.myapp包,但你的Service類在com.service包,會發生什么?
💡 答案:Service類不會被自動掃描到,需要手動添加@ComponentScan("com.service")或者把Service移到com.myapp或其子包下。

五、三劍客如何協同工作

現在我們已經認識了三位劍客,來看看它們是如何配合的:🤝

  1. 啟動階段:SpringApplication.run()啟動時
  2. @SpringBootConfiguration:先識別這是一個配置類
  3. @ComponentScan:掃描組件,注冊Bean定義
  4. @EnableAutoConfiguration:根據條件自動配置
  5. Bean實例化:所有Bean定義就緒后,實例化Bean

它們的執行順序非常重要!組件掃描要先于自動配置,這樣自動配置才能基于已有Bean進行條件判斷。

六、深入理解:@SpringBootApplication源碼解析

讓我們看看這個注解的廬山真面目:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) 
})
public @interface SpringBootApplication {// 可以指定排除的自動配置類@AliasFor(annotation = EnableAutoConfiguration.class)Class[] exclude() default {};// 可以指定排除的自動配置類名@AliasFor(annotation = EnableAutoConfiguration.class)String[] excludeName() default {};// 可以自定義掃描包@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")String[] scanBasePackages() default {};// 可以自定義掃描類@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")Class[] scanBasePackageClasses() default {};
}

可以看到,它主要是組合了三個注解,并提供了一些便捷的屬性來配置它們。

七、實際開發中的最佳實踐

1. 主類位置

? 正確做法:放在項目最頂層包

com
└── myapp├── Application.java  ← 主類在這里├── controller├── service└── repository

? 錯誤做法:放在深層包中

com
└── myapp├── config│   └── Application.java  ← 主類放太深了!├── controller├── service└── repository

2. 多模塊項目配置

對于多模塊項目,可以這樣組織:

// 主模塊中的主類
@SpringBootApplication
@ComponentScan({"com.myapp.module1","com.myapp.module2","com.myapp.shared"
})
public class MyApplication {// ...
}

3. 自定義配置技巧

  • 排除特定自動配置:如測試時排除安全配置
  • 精細控制掃描:只掃描必要的包提高性能
  • 組合使用:可以同時使用這三個注解進行更細粒度控制

八、常見問題解答

Q1: 為什么我的自定義配置類不生效?

可能原因:

  1. 沒有放在組件掃描的路徑下
  2. 類上沒有加@Configuration或相關注解
  3. 被其他配置覆蓋了

解決方案:

  • 檢查包結構
  • 添加@Configuration
  • 使用@Order調整順序

Q2: 自動配置太魔法了,如何知道發生了什么?

解決方法:

  1. 開啟debug模式(debug=true
  2. 查看/actuator/conditions端點(需要actuator依賴)
  3. 閱讀官方文檔的自動配置部分

Q3: 如何覆蓋自動配置的Bean?

很簡單,只需要自己定義一個同類型的Bean:

@Bean
public DataSource dataSource() {// 你的自定義數據源return new MyCustomDataSource();
}

Spring Boot會優先使用你的Bean而不是自動配置的。

九、高級話題:自定義@SpringBootApplication

你甚至可以創建自己的"增強版"@SpringBootApplication

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableCaching
@EnableAsync
public @interface MyEnhancedSpringBootApplication {// 可以添加自定義屬性
}

然后就可以這樣使用:

@MyEnhancedSpringBootApplication
public class MyApplication {// ...
}

這樣就把緩存和異步支持也默認集成了!

十、總結回顧

今天我們深入剖析了@SpringBootApplication背后的三位劍客:

  1. @SpringBootConfiguration - 標識這是一個配置類
  2. @EnableAutoConfiguration - 開啟自動配置魔法
  3. @ComponentScan - 自動掃描組件

記住它們的協作關系:

  • 先識別配置
  • 再掃描組件
  • 最后自動配置

理解這些核心注解的工作原理,能讓你更好地掌握Spring Boot,并在遇到問題時快速定位原因!💡

希望這篇長文對你有所幫助!如果有任何問題,歡迎留言討論~ 😊

Happy Coding! 🚀

推薦閱讀文章

  • 由 Spring 靜態注入引發的一個線上T0級別事故(真的以后得避坑)

  • 如何理解 HTTP 是無狀態的,以及它與 Cookie 和 Session 之間的聯系

  • HTTP、HTTPS、Cookie 和 Session 之間的關系

  • 什么是 Cookie?簡單介紹與使用方法

  • 什么是 Session?如何應用?

  • 使用 Spring 框架構建 MVC 應用程序:初學者教程

  • 有缺陷的 Java 代碼:Java 開發人員最常犯的 10 大錯誤

  • 如何理解應用 Java 多線程與并發編程?

  • 把握Java泛型的藝術:協變、逆變與不可變性一網打盡

  • Java Spring 中常用的 @PostConstruct 注解使用總結

  • 如何理解線程安全這個概念?

  • 理解 Java 橋接方法

  • Spring 整合嵌入式 Tomcat 容器

  • Tomcat 如何加載 SpringMVC 組件

  • “在什么情況下類需要實現 Serializable,什么情況下又不需要(一)?”

  • “避免序列化災難:掌握實現 Serializable 的真相!(二)”

  • 如何自定義一個自己的 Spring Boot Starter 組件(從入門到實踐)

  • 解密 Redis:如何通過 IO 多路復用征服高并發挑戰!

  • 線程 vs 虛擬線程:深入理解及區別

  • 深度解讀 JDK 8、JDK 11、JDK 17 和 JDK 21 的區別

  • 10大程序員提升代碼優雅度的必殺技,瞬間讓你成為團隊寵兒!

  • “打破重復代碼的魔咒:使用 Function 接口在 Java 8 中實現優雅重構!”

  • Java 中消除 If-else 技巧總結

  • 線程池的核心參數配置(僅供參考)

  • 【人工智能】聊聊Transformer,深度學習的一股清流(13)

  • Java 枚舉的幾個常用技巧,你可以試著用用

  • 由 Spring 靜態注入引發的一個線上T0級別事故(真的以后得避坑)

  • 如何理解 HTTP 是無狀態的,以及它與 Cookie 和 Session 之間的聯系

  • HTTP、HTTPS、Cookie 和 Session 之間的關系

  • 使用 Spring 框架構建 MVC 應用程序:初學者教程

  • 有缺陷的 Java 代碼:Java 開發人員最常犯的 10 大錯誤

  • Java Spring 中常用的 @PostConstruct 注解使用總結

  • 線程 vs 虛擬線程:深入理解及區別

  • 深度解讀 JDK 8、JDK 11、JDK 17 和 JDK 21 的區別

  • 10大程序員提升代碼優雅度的必殺技,瞬間讓你成為團隊寵兒!

  • 探索 Lombok 的 @Builder 和 @SuperBuilder:避坑指南(一)

  • 為什么用了 @Builder 反而報錯?深入理解 Lombok 的“暗坑”與解決方案(二)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76799.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76799.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76799.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

weibo_har鴻蒙微博分享,單例二次封裝,鴻蒙微博,微博登錄

weibo_har鴻蒙微博分享,單例二次封裝,鴻蒙微博 HarmonyOS 5.0.3 Beta2 SDK,原樣包含OpenHarmony SDK Ohos_sdk_public 5.0.3.131 (API Version 15 Beta2) 🏆簡介 zyl/weibo_har是微博封裝使用,支持原生core使用 &a…

tomcat集成redis實現共享session

中間件&#xff1a;Tomcat、Redis、Nginx jar包要和tomcat相匹配 jar包&#xff1a;commons-pool2-2.2.jar、jedis-2.5.2.jar、tomcat-redis-session-manage-tomcat7.jar 配置Tomcat /conf/context.xml <?xml version1.0 encodingutf-8?> <!--Licensed to the A…

JavaScript 擴展Array類方法實現數組求和

題目描述&#xff1a;使用原型對象擴展Array類&#xff0c;實現返回數字型數組的和 <script>const arr [1,2,3,4,5,6]Array.prototype.sum function(){return this.reduce((prev,item)>prev item,0)}console.log(arr.sum())</script>求和函數中this 指向調用…

中間件--ClickHouse-11--部署示例(Linux宿主機部署,Docker容器部署)

一、Linux宿主機部署 1、環境準備 操作系統&#xff1a;推薦使用 CentOS 7/8 或 Ubuntu 18.04/20.04。硬件要求&#xff1a; 至少 2 核 CPU 和 4GB 內存。足夠的磁盤空間&#xff08;根據數據量評估&#xff09;。CPU需支持SSE4.2指令集&#xff08;可通過以下命令檢查&#…

鴻蒙NEXT開發權限工具類(申請授權相關)(ArkTs)

import abilityAccessCtrl, { Permissions } from ohos.abilityAccessCtrl; import { bundleManager, common, PermissionRequestResult } from kit.AbilityKit; import { BusinessError } from ohos.base; import { ToastUtil } from ./ToastUtil;/*** 權限工具類&#xff08;…

LVGL學習(二)(lv_label,lv_btn)

3-1_標簽(lv_label) 一、標簽的組成&#xff08;盒子模型&#xff09;?? 標簽由三個核心模塊構成&#xff0c;類似便簽紙的??分層設計??&#xff1a; ??LV_PART_MAIN&#xff08;主體層&#xff09;?? ??功能??&#xff1a;相當于便簽紙的"紙面"&…

深度剖析神經網絡:從基礎原理到面試要點(二)

引言 在人工智能蓬勃發展的今天&#xff0c;神經網絡作為其核心技術之一&#xff0c;廣泛應用于圖像識別、自然語言處理、語音識別等眾多領域。深入理解神經網絡的數學模型和結構&#xff0c;對于掌握人工智能技術至關重要。本文將對神經網絡的關鍵知識點進行詳細解析&#xf…

【java+Mysql】學生信息管理系統

學生信息管理系統是一種用于管理學生信息的軟件系統&#xff0c;旨在提高學校管理效率和服務質量。本課程設計報告旨在介紹設計和實現學生信息管理系統的過程。報告首先分析了系統的需求&#xff0c;包括學生基本信息管理、成績管理等功能。接著介紹了系統的設計方案&#xff0…

Linux mmp文件映射補充(自用)

addr一般為NULL由OS指明&#xff0c;length所需長度&#xff08;4kb對齊&#xff09;&#xff0c;prot&#xff08;權限&#xff0c;一般O_RDWR以讀寫&#xff09;&#xff0c; flag&#xff08;MAP_SHARED(不刷新到磁盤上&#xff0c;此進程獨有)和MAP_PRIVATE&#xff08;刷新…

Nginx openresty web服務 與 Go 原生web服務性能對比

1 概述 Nginx采用的是IO復用模型&#xff0c;能處理超高并發。 Go語言采用協程&#xff0c;能輕量級的處理超高并發。 那么在不考慮業務邏輯復雜的前提下&#xff0c;即假如將Nginx和Go都提供一個/test接口&#xff0c;并在接口邏輯中都只是讓其做20毫秒的耗時操作&#xff0c…

[創業之路-377]:企業法務 - 有限責任公司與股份有限公司的優缺點對比

有限責任公司&#xff08;簡稱“有限公司”&#xff09;與股份有限公司&#xff08;簡稱“股份公司”&#xff09;是我國《公司法》規定的兩種主要公司形式&#xff0c;二者在設立條件、治理結構、股東權利義務等方面存在顯著差異。以下從核心特征、設立條件、治理結構、股東權…

QEMU源碼全解析 —— 塊設備虛擬化(21)

接前一篇文章:QEMU源碼全解析 —— 塊設備虛擬化(20) 本文內容參考: 《趣談Linux操作系統》 —— 劉超,極客時間 《QEMU/KVM源碼解析與應用》 —— 李強,機械工業出版社 特此致謝! 上一回開始解析blockdev_init函數,講到了其中調用的blk_new_open函數,該函數的作用…

藍橋杯中的知識點

總結&#xff1a; 這次考的并不理想 比賽前好多知識點遺漏 但到此為止已經結束了 mod 是 模運算&#xff08;Modulo Operation&#xff09;的縮寫&#xff0c;表示求兩個數相除后的 余數 10mod31 (a % b) &#xff08;7%21&#xff09; 1e9代表1乘以10的9次方&#xff0c…

批量替換多個 Word 文檔中的指定圖片

在 Word 文檔中&#xff0c;我們可以插入各種各樣的圖片&#xff0c;比如插入 logo、插入設計圖、施工圖等等。在某些情況下&#xff0c;我們也會碰到需要將 Word 文檔中某張圖片替換成其它圖片的場景&#xff0c;比如將舊的 Logo 替換成新的 Logo。當我們有大量的 Word 文檔需…

基于微信小程序的中醫小妙招系統的設計與實現

hello hello~ &#xff0c;這里是 code袁~&#x1f496;&#x1f496; &#xff0c;歡迎大家點贊&#x1f973;&#x1f973;關注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者簡介&#xff1a;一名喜歡分享和記錄學習的在校大學生…

Java 8 新特性深度解析:現代編程的轉折點

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 Java 8 是 Java 發展史上的重要里程碑&#xff0c;它引入了函數式編程范式、增強了集合處理能力&#xff0c;并徹底革新了日期時間處理方式。本文將通過代碼示…

鷓鴣云平臺實時追蹤任務進度的核心機制

一、?三維可視化監控? BIMGIS融合建模?&#xff1a;通過無人機測繪與三維建模技術生成施工場地數字孿生模型&#xff0c;支持實時查看各標段三維模型與施工進度的匹配度&#xff0c;偏差超過5%自動觸發預警。 進度匹配度分析?&#xff1a;中央數據中臺整合施工規劃、資源…

【Spring Boot】MyBatis多表查詢的操作:注解和XML實現SQL語句

1.準備工作 1.1創建數據庫 &#xff08;1&#xff09;創建數據庫&#xff1a; CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;&#xff08;2&#xff09;使用數據庫 -- 使?數據數據 USE mybatis_test;1.2 創建用戶表和實體類 創建用戶表 -- 創建表[??表…

ISO15189認證有什么要求?ISO15189認證流程

ISO 15189 認證要求及流程詳解 ISO 15189 是國際標準化組織&#xff08;ISO&#xff09;針對 醫學實驗室質量和能力 的認證標準&#xff0c;適用于醫院檢驗科、第三方醫學實驗室、血站等機構。該認證確保實驗室的技術能力和管理體系符合國際標準&#xff0c;提高檢測結果的準確…

【Linux】調試工具gdb的認識和使用指令介紹(圖文詳解)

目錄 1、debug和release的知識 2、gdb的使用和常用指令介紹&#xff1a; &#xff08;1&#xff09;、windows下調試的功能&#xff1a; &#xff08;2&#xff09;、進入和退出&#xff1a; &#xff08;3&#xff09;、調試過程中的相關指令&#xff1a; 3、調試究竟是在…