SpringBoot的自動裝配

我們今天再來說一下關于 SpringBoot 的自動裝配,為什么會有這樣的問題呢?一般這種情況都是在面試的過程中,面試官有時候會問到這個問題,就比如從開始問SpringBoot 的一些常用注解,到SpringBoot的一些特性,然后引申到這個 SpringBoot 的自動裝配上來。今天就和了不起一起來聊聊關于這個 SpringBoot 的自動裝配吧。

什么是SpringBoot的裝配

Spring Boot 的自動裝配(Auto-Configuration)是指 Spring Boot 會根據項目中添加的依賴和其他因素,自動配置你的 Spring 應用程序。這一特性使得開發者在創建 Spring 應用程序時,可以省去大量的手動配置工作,從而快速啟動和運行應用程序。

自動裝配流程

SpringBoot的自動裝配工作流程主要基于其核心注解和一系列的配置機制,以下是對其工作流程的詳細解析:

1. 啟動注解:

  • SpringBoot的自動裝配始于@SpringBootApplication注解。這個注解實際上是@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan三個注解的組合。

2,@SpringBootConfiguration:

  • @SpringBootConfiguration注解本質上是一個@Configuration注解的包裝,用于聲明當前類是一個配置類,可以定義Bean,也可以引入其他配置類。3.@EnableAutoConfiguration:

  • 這是實現自動裝配的關鍵注解。它包含了@AutoConfigurationPackage和@Import(AutoConfigurationImportSelector.class)兩個子注解。

  • @AutoConfigurationPackage:用于自動配置包,使得主配置類(帶有@SpringBootApplication注解的類)所在的包及其子包中的組件都能被Spring容器掃描到。

  • @Import(AutoConfigurationImportSelector.class):這個注解的作用是導入類,但在這里它并不是直接導入一個普通的類,而是導入了一個實現了ImportSelector接口的類AutoConfigurationImportSelector。這個類的作用是根據一定的規則(比如類路徑下的META-INF/spring.factories文件)來加載并配置一些自動裝配的類。

4.META-INF/spring.factories:

  • 在Spring Boot的自動裝配過程中,META-INF/spring.factories文件起到了非常關鍵的作用。這個文件是Spring Boot用來加載自動配置類的一個約定俗成的文件,它位于各個Spring Boot Starter的jar包中。Spring Boot在啟動時,會掃描所有jar包中的META-INF/spring.factories文件,并將其中配置的自動配置類加載到Spring容器中。

5.自動配置類:

  • 這些類通常是以AutoConfiguration結尾的,它們使用@Configuration注解標注,并且內部定義了一些Bean。這些Bean就是Spring Boot自動裝配到Spring容器中的組件。

6.條件裝配:

  • 在自動配置類中,經常可以看到@ConditionalOnClass、@ConditionalOnProperty等條件注解。這些注解的作用是判斷當前環境是否滿足某個條件,如果滿足則進行自動裝配,否則不進行裝配。這樣可以根據項目的實際情況來靈活地選擇需要裝配的組件。

7.總結:

SpringBoot的自動裝配工作流程大致可以歸納為:首先通過@SpringBootApplication注解啟動Spring Boot應用,然后利用@EnableAutoConfiguration注解中的@Import(AutoConfigurationImportSelector.class)來加載META-INF/spring.factories文件中配置的自動配置類,最后根據這些自動配置類中的定義和條件注解來將相應的組件裝配到Spring容器中。

自動裝配的核心

@SpringBootApplication

這個注解,就是自動裝配的核心,我們來詳細解讀一下這個 @SpringBootApplication

它其實是一個組合注解,用于簡化 Spring Boot 應用的配置。這個注解通常被用在 Spring Boot 的主類上,以指示該類是一個特殊的配置類,用于引導應用上下文的啟動。

組成部分

1.@SpringBootConfiguration:

  • 這是一個特殊的 @Configuration 注解,表示該類是一個配置類,并告訴 Spring Boot 這是一個特殊的配置類,用于加載應用的上下文設置。

  • 實際上,@SpringBootConfiguration 僅僅是 @Configuration 的一個特殊版本,并且二者在功能上沒有區別。但 @SpringBootConfiguration 更多地用于標識這是一個 Spring Boot 應用。

2.@EnableAutoConfiguration:

  • 這是 Spring Boot 的核心特性之一。它告訴 Spring Boot 根據添加的 jar 依賴項、類路徑設置、各種屬性設置等自動配置你的 Spring 應用。例如,如果你的類路徑下有 spring-boot-starter-web,那么 Spring Boot 會自動配置嵌入式 Tomcat 服務器和 Spring MVC。

  • 你可以通過 spring.autoconfigure.exclude 屬性來排除某些自動配置。

3.@ComponentScan:

  • @ComponentScan 告訴 Spring 掃描當前包及其子包下的組件(如 @Component、@Service、@Repository、@Controller 等),并將它們注冊為 Spring Bean。

  • 默認情況下,它會掃描標注了 @SpringBootApplication 注解的類所在的包及其子包。你可以通過 basePackages 或 basePackageClasses 屬性來指定掃描的包。

如果這個時候,我們給面試官解釋了這個 SpringBoot的自動裝配的原理之后,面試官很大程度上就開始要往下延伸內容了,既然 @Autowired 能實現了則個自動裝配,那么還有其他注解么?以及他和 @Autowired 的區別在哪呢?

@Resource和@Autowire

@Resource 和 @Autowired 都是 Spring 框架中用于自動裝配 bean 的注解,但它們之間有一些區別。以下是這兩個注解的主要區別:

來源不同

@Autowired 是 Spring 特有的注解,用于自動裝配 bean。

@Resource 是 Java 的標準注解,屬于 JSR-250 規范的一部分,但 Spring 也支持它作為自動裝配的注解。

@Autowired

@Autowired 是 Spring 特有的注解,用于自動裝配 bean。Spring 容器會檢查 bean 的屬性、方法以及構造器,然后使用與指定類型相匹配的 bean 進行自動裝配。

  • 類型匹配:默認情況下,@Autowired 是基于類型(Type)的自動裝配。如果存在多個相同類型的 bean,那么就需要使用其他機制(如 @Qualifier 注解或 @Primary 注解)來進一步指定。

  • 構造器注入:Spring 4.3 之后,推薦使用構造器注入來替代字段注入,因為它可以提供更好的不可變性和測試性。

  • 可配置性:@Autowired 是可選的,并且可以通過 Spring 的配置文件(如 XML 文件)進行更詳細的配置。

@Resource

@Resource 是 Java EE 的一部分(來自 JSR-250),同時也是 Spring 支持的注解。它提供了更豐富的功能,包括指定名稱(name)和類型(type)來查找 bean。

  • 名稱和類型匹配:與 @Autowired 相比,@Resource 提供了更靈活的匹配方式。它可以基于名稱(如果提供了)或類型進行查找。如果同時指定了名稱和類型,并且找不到匹配的 bean,那么就會拋出異常。

  • 與 Java EE 兼容:由于 @Resource 是 Java EE 的一部分,因此它可以在任何支持 Java EE 的環境中使用,而不僅僅是 Spring。

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

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

相關文章

zynq之UART

之前嘗試UART0(MIO50、51),串口調試助手收到發送的內容。 現在板子上EMIO端有多個串口,所以看看這個怎么弄。 串口是484的轉接板(接232的串口就會輸出亂碼) https://blog.51cto.com/u_15262460/2882973 …

【九十三】【算法分析與設計】719. 找出第 K 小的數對距離,N 臺電腦的最長時間,二分答案法

719. 找出第 K 小的數對距離 - 力扣&#xff08;LeetCode&#xff09; 數對 (a,b) 由整數 a 和 b 組成&#xff0c;其數對距離定義為 a 和 b 的絕對差值。 給你一個整數數組 nums 和一個整數 k &#xff0c;數對由 nums[i] 和 nums[j] 組成且滿足 0 < i < j < nums.le…

java調用遠程接口下載文件

在postman中這樣下載文件 有時下載文件太大postman會閃退&#xff0c;可以通過代碼下載&#xff0c;使用hutool的http包

3步操作助您輕松實現蘋果手機照片一鍵傳輸至電腦

對于很多使用蘋果手機的用戶來說&#xff0c;隨著手機中照片和視頻數量的不斷積累&#xff0c;如何將這些珍貴的回憶從手機轉移到電腦&#xff0c;以便更好地保存、整理和分享&#xff0c;成為了一個值得關注的問題。那么&#xff0c;蘋果手機怎么把照片導入電腦呢&#xff1f;…

鴻蒙課程培訓 | 訊方技術與鴻蒙生態服務公司簽約,成為鴻蒙鉆石服務商

3月15日&#xff0c;深圳市訊方技術股份有限公司與鴻蒙生態服務公司簽署合作協議&#xff0c;訊方技術成為鴻蒙鉆石服務商&#xff0c;正式進軍鴻蒙原生應用培訓開發領域。訊方技術總裁劉國鋒、副總經理劉銘皓、深圳區域總經理張松柏、深圳區域交付總監張梁出席簽約儀式。 作…

鄉村振興的鄉村產業創新發展:培育鄉村新興產業,打造鄉村產業新名片,促進鄉村經濟多元化發展

目錄 一、引言 二、鄉村產業創新發展的必要性 &#xff08;一&#xff09;適應新時代發展要求 &#xff08;二&#xff09;滿足消費升級需求 &#xff08;三&#xff09;促進農民增收致富 三、培育鄉村新興產業策略 &#xff08;一&#xff09;加強科技創新引領 &#…

在 MFC 中 UNICODE 加 _T 與 L 長字符串,有什么區別?

在MFC&#xff08;Microsoft Foundation Classes&#xff09;和更廣泛的Windows編程環境中&#xff0c;UNICODE宏用于指示程序應使用Unicode字符集&#xff08;通常是UTF-16&#xff09;來處理文本。當定義了UNICODE宏時&#xff0c;編譯器和庫函數會期待和處理寬字符&#xff…

Android下HWC以及drm_hwcomposer普法((上)

Android下HWC以及drm_hwcomposer普法((上) 引言 按摩得全套&#xff0c;錯了&#xff0c;做事情得全套&#xff0c;普法分析也是如此。drm_hwcomposer如果對Android圖形棧有一定研究的童鞋們應該知道它是Android提供的一個的圖形后端合成處理HAL模塊的實現。但是在分析這個之前…

Java復習-集合篇

集合 集合分為倆大類 單列集合 每個元素數據只包含一個值 雙列集合 每個元素包含倆個鍵值對 Conllection單列集合 單列集合常用的主要是下列幾種 List集合 List系列集合的特點&#xff1a;添加元素是有序、可重復、有索引 這里我們來試一下ArrayList ArrayList<String&g…

Spring OAuth2:開發者的安全盾牌!(上)

何利用Spring OAuth2構建堅不可摧的安全體系&#xff1f;如何使用 OAuth2 從跨域挑戰到性能優化&#xff0c;每一個環節都為你的應用保駕護航&#xff1f; 文章目錄 Spring OAuth2 詳解1. 引言簡述OAuth2協議的重要性Spring Framework對OAuth2的支持概述 2. 背景介紹2.1 OAuth2…

比較Rust和Haskel

在比較Rust和Haskell時&#xff0c;我們可以從多個維度來分析它們各自的優勢。以下是Rust相對于Haskell的優勢&#xff0c;以及Haskell相對于Rust的優勢&#xff1a; Rust比Haskell強的方面&#xff1a; 內存安全與并發性&#xff1a; Rust通過獨特的所有權系統和借用檢查器在…

智能倉儲物流系統(WMS)系列-管理查詢調整

好的應用系統應是細分簡單&#xff0c;界面簡潔易操作&#xff0c;程序代碼簡潔易懂的。

史上最全排序算法整理(2)

本篇文章我們將接著上篇繼續介紹常見的排序算法&#xff0c;有需要的小伙伴可以移步史上最全排序算法整理&#xff08;1&#xff09;查看相關內容哦 1.冒泡排序 1.1基本思想 在待排序的一組數中&#xff0c;將相鄰的兩個數進行比較&#xff0c;若前面的數比后面的數大就交換兩…

【解決npm install -g windows-build-tools的安裝問題】

解決npm install -g windows-build-tools的安裝問題 https://developer.huawei.com/consumer/cn/forum/topic/0203740461436730610?fid26

gitlab 創建 ssh 和 token

文章目錄 一、創建ssh key二、將密鑰內容復制到gitlab三、創建token 一、創建ssh key 打開控制臺cmd&#xff0c;執行命令 ssh-keygen -t rsa -C xxxxx xxxxx是你自己的郵箱 C:\Users\xx\.ssh 目錄下會創建一個名為id_rsa.pub的文件&#xff0c;用記事本打開&#xff0c;并…

基于深度學習的中文情感分析系統python flask

基于python的畢業設計 基于深度學習的中文情感分析系統(flask)(源碼說明文檔演示) 畢業設計課程設計期末大作業、課程設計、高分必看&#xff0c;下載下來&#xff0c;簡單部署&#xff0c;就可以使用。 包含&#xff1a;項目源碼、數據庫腳本、軟件工具等&#xff0c;該項目…

【Spring Cloud】微服務工程中的服務注冊與發現配置中心-Consul

Catalog Spring Cloud Consul一、需求二、是什么三、優點四、缺點五、怎么用六、細節 Spring Cloud Consul 一、需求 多個微服務之間通過RestTemplate中的api相互調用&#xff0c;一般要寫死微服務的IP地址和端口號&#xff0c;相當于硬編碼&#xff0c;非常不靈活&#xff0…

MyBatis出現:SQLSyntaxErrorException: Unknown column ‘XXX‘ in ‘field list‘

<update id"updateStudent">update tb_students set stu_name${stuName},stu_gender${stuGender},stu_age${stuAge},stu_tel${stuTel}where stu_num ${stuNum}</update> 本質上來說&#xff0c;是Mybatis使用上的錯誤&#xff0c;不熟悉&#xff0c;理…

C#知識|通過ADO.NET實現應用程序對數據庫的增、刪、改操作。

哈嘍,你好啊,我是雷工! 前邊學習了SQLServer數據庫相關的增刪改查的基本操作, 上節練習了C#通過ADO.NET技術和SQLServer數據庫建立連接和斷開連接的寫法, 本節繼續學習ADO.NET的相關操作,下面為向數據庫中插入數據的相關練習筆記。 01 向數據庫插入數據 插入數據的過程…

SQL函數--union all 使用方法及案例

1. 使用方法 在 SQL 中&#xff0c;UNION ALL 操作用于結合兩個或更多 SELECT 語句的結果集&#xff0c;包括所有匹配的行&#xff0c;甚至包括重復的行。這與 UNION 不同&#xff0c;因為 UNION 會自動刪除重復的行。 滿足條件&#xff1a; 1、兩個select查詢的列的數量必須相…