Spring Boot自動裝配原理源碼分析

2021-01-13 計算機java編程

011.環境準備

使用IDEA Spring Initializr快速創建一個Spring Boot項目

添加一個Controller類

主配置類如下

022.註解分析

Spring Boot規定,項目的主配置類必須放在最外層包,也就是說,所有的類都必須放在主配置類的同級包或者子包裡,這麼做的用意是什麼?我們點開@SpringBootApplication註解慢慢分析(下面代碼中省略元註解)...

@SpringBootApplication內部標註了三個註解:

@SpringBootConfiguration進入源碼中可以看見,@SpringBootConfiguration其實就是Spring中的@Configuration,用於標註配置類

@ComponentScan這個註解也是Spring中的,它用來將指定包下需要裝配的組件註冊到容器中@EnableAutoConfiguration接下來才是今天的重頭戲,Spring Boot自動配置的主角!

033.自動裝配的主角

進入@EnableAutoConfiguration源碼你會發現這個註解中標註了兩個註解@AutoConfigurationPackage和@Import

(1)、@AutoConfigurationPackage

點進該註解

在點進Register,這是一個靜態內部類

我們在第一個方法處打一個斷點debug一下,發現new PackageImport(metadata).getPackageName()的結果其實就是一個包名,這時我們很容易的可以想到,這個包就是Spring Boot主配置類所在的包

再看一眼metadata,果然,就是主配置類

因此,這個註解的作用就是將主配置類所在的包作為自動配置包進行管理

(2)、@Import(AutoConfigurationImportSelector.class)

@Import的作用就是導入一個類到IOC容器,我們先來看一下導入的這個類:自動配置導入選擇器源碼裡有一個方法selectImports,選擇導入

在getCandidateConfigurations方法處打一個斷點,發現configurations的結果是所有的xxxAtuoConfiguration類,一共124個,請記住這個數字。

那麼這些自動配置類是如何獲取的呢,從哪裡獲取的呢?

我們繼續點進getCandidateConfigurations,獲取候選的配置

打開spring-boot-autoconfigure-2.2.4.RELEASE.jar/META-INF/spring.factories,文件部分類容如下,你可以點進去看看第22~145行,確實是124個全類名

04

加載了這麼多類我們又不一定全都用得到,設計師肯定會想辦法讓類在我們需要的時候才生效,我們隨便點進一個類,可以看到一片飄紅,因為我們並沒有引入RabbitMQ相關依賴,再看一個註解ConditionalOnClass,意思就是存在某個指定的類才生效,類似的註解還有很多,都是@ConditionaOn xxx,在一定條件下類才會生效。

由於引入了web模塊,WebMvcAutoConfiguration正常顯示

相關焦點

  • Spring Boot Admin快速打造監控平臺
    但比較遺憾的是沒有可視化界面,只能通過乾燥的json數據來查看相應的指標,如下圖: 今天我們介紹一個可視化的監控指標平臺Spring Boot Admin,它利用spring-boot-starter-actuator
  • Rocket-API 2.3.2 發布,基於 spring boot 的 API 敏捷開發框架
    功能新增或修改: 遠程部署重複判斷 添加mongo對象操作函數 mapping路徑匹配修改,解決restful下路徑可能會匹配執行邏輯錯誤問題 增加配置項 駝峰轉換配置 spring.rocket-api.map-underscore-to-camel-case
  • Spring Boot 2.2.0 發布,性能提升、支持 Java 13
    Spring Boot 2.2.0 正式發布了,可從 repo.spring.io 或是 Maven Central 獲取。
  • Spring Boot 2.4 第一個示例程序書寫代碼
    import org.springframework.boot.*;import org.springframework.boot.autoconfigure.*;import org.springframework.web.bind.annotation.
  • 基於Spring Boot + MVC 之控制器Controller實現
    在src-main-java下面,找到com.zzfeng.springbootdemo這個包,在這個包上面右擊,再分別點擊New-Package,進入創建包的面板。在New Package面板上輸入包名controller,完成包的創建。創建成功後,會在com.zzfeng.springbootdemo下面出現一個名叫controller的包。
  • Spring Boot 2.4 MacPorts 安裝 CLI
    你可以通過使用下面的命令來安裝 Spring Boot CLI:$ sudo port install spring-boot-cliMacPorts 和 Homebrew 其實是類似的一個包管理工具。Mac 算是BSD的一個變種。所以,BSD 的包管理軟體 port 被移植到 Mac 上就顯的理所當然了。
  • SpringSecurity 默認表單登錄頁展示流程源碼
    1.準備工作(體驗SpringSecurity默認表單認證)1.1 創建SpringSecurity項目先通過IDEA 創建一個SpringBoot項目 並且依賴SpringSecurity,Web依賴此時pom.xml會自動添加
  • Spring Boot 1.3.0 M4 發布 - OSCHINA - 中文開源技術交流社區
    H2 auto-configurationThe H2 auto-configuration feature introduced in 1.3.0.M3 was not enabled properly when spring-boot-devtools is available on the classpath. This has been fixed.
  • 超聲波測距原理(帶原理圖及源碼)
    02 超聲波測距原理超聲波發射器向某一方向發射超聲波,在發射時刻的同時開始計時,超聲波在空氣中傳播,途中碰到障礙物就立即返回來,超聲波接收器收到反射波就立即停止計時。根據時間差和超聲波的速度可以估算出發射位置到障礙物位置的距離。
  • 使用Spring Boot,Angular 6和Maven構建Web應用程式
    mvn spring-boot:run應用程式啟動後,我們應該能夠查看歡迎頁面。大家有什麼學習困難或疑惑的可以找我交流,想要更多JAVA系統學習方法及資料的私信獲取
  • Spring 的 Controller 是單例還是多例?怎麼保證並發的安全
    我們下面來簡單的驗證下:package com.riemann.springbootdemo.controller;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Controller
  • Java面試高頻考點:手寫Spring IOC實現機制
    這個「別人」在spring框架中指的就是IOC容器,它負責對象的生命周期和對象之間的關係。Spring IOC的概念以及原理在面試過程中屬於一個被問爛的問題,本篇文章不再過多贅述。我們重點研究一下如何自己實現一個最簡單的Spring IOC。目前注入Bean的方式有兩種,一種是通過編寫XML文件注入,另一種是通過註解注入。
  • Spring中這些能升華代碼的技巧,可能會讓你愛不釋手
    有些讀者私信我說希望後面多分享spring方面的文章,這樣能夠在實際工作中派上用場。正好我對spring源碼有過一定的研究,並結合我這幾年實際的工作經驗,把spring中我認為不錯的知識點總結一下,希望對您有所幫助。
  • Spring boot + Spring Security實現權限管理
    基於Spring boot + Spring Security實現第一版傳統架構本文是實訓邦的權限管理SpringSecurity+JWT的一個講義,分享給粉絲學習。任務案例分析權限管理是一個幾乎所有後臺系統的都會涉及的一個重要組成部分,可以說是後臺項目的基本功,主要目的是對整個後臺管理系統進行權限的控制,而針對的對象是員工,避免因權限控制缺失或操作不當引發的風險問題,如操作錯誤,數據洩露等問題。
  • 俯瞰Dubbo全局,閱讀源碼前必須掌握這些!!
    但是,為了更好的理解Dubbo,我將本文重點分成三個部分:Dubbo中的核心角色、搭建Dubbo源碼環境、Dubbo核心模塊說明、運行Dubbo的示例程序 四個部分。說幹就幹,上重點。註:本系列專題,我是基於Dubbo 2.7.8版本進行源碼分析的。
  • java任務調度之Timer定時器(案例和源碼分析)
    對此就有必要深入其源碼看看了。二、Timer源碼分析對於一個類的源碼分析,我一貫的思路就是先從參數開始,然後構造方法,最後就是常用方法。下面我們就按照這個思路開始今天的源碼分析,在這裡基於jdk1.8。