1. 程式人生 > >springboot自動配置原始碼解析

springboot自動配置原始碼解析

springboot版本:2.1.6.RELEASE

     SpringBoot 自動配置主要通過 @EnableAutoConfiguration@Conditional@EnableConfigurationProperties 或者 @ConfigurationProperties 等幾個註解來進行自動配置完成的。

@EnableAutoConfiguration 開啟自動配置,主要作用就是呼叫 Spring-Core 包裡的 loadFactoryNames()

,將 autoconfig 包裡的已經寫好的自動配置載入進來。

@Conditional 條件註解,通過判斷類路徑下有沒有相應配置的 jar 包來確定是否載入和自動配置這個類。

@EnableConfigurationProperties 的作用就是,給自動配置提供具體的配置引數,只需要寫在 application.properties 中,就可以通過對映寫入配置類的 POJO屬性中。

 接下來我們一步步去跟蹤原始碼,來印證以上觀點:


首先開啟啟動類:

@SpringBootApplication
public class SponsorApplication {

    public static void main(String[] args) {

        SpringApplication.run(SponsorApplication.class, args);
    }
}  

 

進入到註解@SpringBootApplication中

 

接下去,進入@EnableAutoConfiguration註解中,如下圖

我們可以看到@Import註解,繼續點選進入AutoConfigurationImportSelector中,找到selectImports方法,如下圖

繼續點選進入selectImport方法中的getAutoConfigurationEntry方法中,如下圖

在此方法中,我們可以看到getCandidateConfigurations方法,繼續點進去,讓我們一探究竟,謎團馬上就要解開了,

進入loadFactoryNames方法

 進入loadSpringFactories方法中

好了,讓我們看看FACTORIES_RESOURCE_LOCATION到底是什麼

到這裡,我們發現一頓操作以後最終是載入的META-INF/spring.factorieswen檔案,那麼這個檔案應該去哪裡找呢,我們如果使用idea的話,那麼請找到project下的External Libraries中的org.springframework.boot.autoconfigure,然後開啟,可以看到一系列Spring Boot自動配置的列表

如下圖:

 

 下面我們來看自動配置redis的細節,RedisAutoConfiguration:

 

這個類進行了簡單的Spring配置,聲明瞭Redis所需典型Bean,和其它很多類一樣,重度依賴於Spring Boot註釋:
1)@ConditionOnClass啟用一個配置,當類路徑中存在這個類時才會配置該類
2)@EnableConfigurationProperties自動對映一個POJO到Spring Boot配置檔案(預設是application.properties檔案)的屬性集。
3)@ConditionalOnMissingBean啟用一個Bean定義,但必須是這個Bean之前未定義過才有效。
還可以使用@ AutoConfigureBefore註釋、@AutoConfigureAfter註釋來定義這些配置類的載入順序。

著重瞭解@Conditional註釋性

此註釋使得只有在特定條件滿足時才啟用一些配置。SrpingBoot的AutoConfig大量使用了@Conditional,它會根據執行環境來動態注入Bean。這裡介紹一些@Conditional的使用和原理,並自定義@Conditional來自定義功能。

  • @Conditional是SpringFramework的功能,SpringBoot在它的基礎上定義了
  • @ConditionalOnClass,@ConditionalOnProperty等一系列的註解來實現更豐富的內容。

具體幾個@Conditon*註解的含義

@ConditionalOnBean

僅僅在當前上下文中存在某個物件時,才會例項化一個Bean

@ConditionalOnClass

某個class位於類路徑上,才會例項化一個Bean),該註解的引數對應的類必須存在,否則不解析該註解修飾的配置類

@ConditionalOnExpression

當表示式為true的時候,才會例項化一個Bean

@ConditionalOnMissingBean

僅僅在當前上下文中不存在某個物件時,才會例項化一個Bean,該註解表示,如果存在它修飾的類的bean,則不需要再建立這個bean,可以給該註解傳入引數例如@ConditionOnMissingBean(name = "example"),這個表示如果name為“example”的bean存在,這該註解修飾的程式碼塊不執行

@ConditionalOnMissingClass

某個class類路徑上不存在的時候,才會例項化一個Bean

@ConditionalOnNotWebApplication

不是web應用時,才會執行

 

接下去,我們再看下Properties系列註釋:

@EnableConfigurationProperties
@ConfigurationProperties(prefix = "may")

在需要注入配置的類上加上這個註解,prefix的意思是,以該字首打頭的配置,以下是例子

application.yml中的配置

如果不用系統初始的application.yml配置類,而是使用自己的如youjie.yml,可以如下配置

@EnableConfigurationProperties

最後注意在spring Boot入口類加上@EnableConfigurationProperties

其實這裡@EnableConfigurationProperties({User.class,User2.class}) 可以省略

 

 SpringBoot 的 自動配置得益於 SpringFramework 強大的支撐,框架早已有很多工具和註解可以自動裝配 Bean 。SpringBoot 通過 一個封裝,將市面上通用的元件直接寫好了配置類。當我們程式去依賴了這些元件的 jar 包後,啟動 SpringBoot應用,於是自動載入開始了。

 

總結: 

SpringBoot 自動配置主要通過 @EnableAutoConfiguration@Conditional@EnableConfigurationProperties 或者 @ConfigurationProperties 等幾個註解來進行自動配置完成的。

@EnableAutoConfiguration 開啟自動配置,主要作用就是呼叫 Spring-Core 包裡的 loadFactoryNames(),將 autoconfig 包裡的已經寫好的自動配置載入進來。

@Conditional 條件註解,通過判斷類路徑下有沒有相應配置的 jar 包來確定是否載入和自動配置這個類。

@EnableConfigurationProperties 的作用就是,給自動配置提供具體的配置引數,只需要寫在 application.properties 中,就可以通過對映寫入配置類的 POJO屬性中。

 

 

 

 

 

 

            
           

相關推薦

SpringBoot-自動配置原始碼解析

接著上一篇部落格《 SpringBoot-快速搭建WEB工程》提出的需要分析的三個方面:我們來深入的探究SpringBoot是如何在沒有一個配置檔案的情況下為我們啟動好一個完整的WEB工程的,首先我們從@SpringBootApplication 開始這裡的分析

springboot自動配置原始碼解析

springboot版本:2.1.6.RELEASE      SpringBoot 自動配置主要通過 @EnableAutoConfiguration, @Conditional, @EnableConfigurationProperties&nb

Spring boot自動配置原始碼解析

閱讀須知 版本:2.0.4 文章中使用/* */註釋的方法會做深入分析 正文 自動配置是Spring boot的一大亮點,讓我們從Spring繁雜的配置中脫身而出,本篇文章我們就來分析一下Spring boot自動配置的原始碼。不知道讀者是否有注意到,在分

我是如何做到springboot自動配置原理解析

一前言 springboot 2.0.0版本分析,整體的自動配置流程如下: 具體配置參考官方文件:springboot-doc 二 @SpringBootApplication 核心註解@SpringBootConfiguration其實就是@Configuration註解,表示是個配置類;@Enable

頭禿了,Spring Boot 自動配置原始碼解析瞭解一波~

持續原創輸出,點選上方藍字關注我 目錄 前言原始碼版本@SpringBootApplication幹了什麼?@EnableAutoConfiguration幹了什麼?總結 前言 為什麼Spring Boot這麼火?因為便捷,開箱即用,但是你思考過為什麼會這麼便捷嗎?傳統的SSM架構配置檔案至少要寫半天,

springboot原始碼解析:自己實現一個springboot自動配置

上兩篇將到了springboot自動配置和條件註解是如何實現,這篇在前兩篇的基礎上自己實現一個springboot的自動配置,用到條件註解。 需求:加入自己手寫的jar。直接就可以使用StringRedisTemplate。 1.新建一個maven專案,pom.xml如下:

SpringBoot自動配置註解原理解析

1. SpringBoot啟動主程式類: 1 @SpringBootApplication 2 public class DemoApplication { 3 public static void main(String[] args) { 4 5 SpringApp

案例解析springboot自動配置未生效問題定位(條件斷點)

  Spring Boot在為開發人員提供更高層次的封裝,進而提高開發效率的同時,也為出現問題時如何進行定位帶來了一定複雜性與難度。但Spring Boot同時又提供了一些診斷工具來輔助開發與分析,如spring-boot-starter-actuator。本文分享一個基於actuator與IDE

原始碼學習系列之SpringBoot自動配置(篇一)

原始碼學習系列之SpringBoot自動配置原始碼學習(篇一) ok,本部落格嘗試跟一下Springboot的自動配置原始碼,做一下筆記記錄,自動配置是Springboot的一個很關鍵的特性,也容易被忽略的屬性,因為這個屬性被包括在@SpringBootApplication註解裡,所以不去跟一下原始碼都不知

原始碼學習系列之SpringBoot自動配置(篇二)

原始碼學習系列之SpringBoot自動配置(篇二)之HttpEncodingAutoConfiguration 原始碼分析 繼上一篇部落格原始碼學習系列之SpringBoot自動配置(篇一)之後,本部落格繼續跟一下SpringBoot的自動配置原始碼 ok,先複習一下上一篇的內容,從前面的學習,我們知道了S

SpringBoot Profile使用詳解及配置原始碼解析

在實踐的過程中我們經常會遇到不同的環境需要不同配置檔案的情況,如果每換一個環境重新修改配置檔案或重新打包一次會比較麻煩,Spring Boot為此提供了Profile配置來解決此問題。 Profile的作用 Profile對應中文並沒有合適的翻譯,它的主要作用就是讓Spring Boot可以根據不同環境提供不

SpringBoot自動配置原理原始碼級別分析

# SpringBoot自動配置原理 ### 前言 後面還會講到SpringBoot自動配置原理,會主要講解@EnableAutoConfiguratuon註解幫助我們做了什麼事情,是如何自動把自動配置類掃描到容器中的,建議看完這篇後,兩篇配合使用,[傳送門](https://blog.csdn.net/

SpringBoot自動配置xxxAutoConfiguration 的使用

調用棧 是否 PE provider onf pub div 存在 ring 以MybatisAutoConfiguration為例1. 在jar包中/META-INF/spring.factories中配置org.springframework.boot.autoconf

SpringBoot自動配置原理

override activity eve rop 哪些 isf 代碼 文件 multi SpringBoot自動配置原理 備註:該SpringBoot自動配置原理不適合java剛入門學者以及不熟悉Spring4+Springmvc+maven的同學 1、當Sprin

SpringBoot-自動配置原理

factory ESS bean att cond active tor 條件判斷 common 可配置項參考: https://docs.spring.io/spring-boot/docs/2.0.1.BUILD-SNAPSHOT/reference/htmlsingl

(轉)入門SpringBoot-自動配置原理(三)

leg ebs jdbc 路徑 ket dao posit 把他 exc 1、自動配置原理: 1)、SpringBoot啟動的時候加載主配置類,開啟了自動配置功能 ==@EnableAutoConfiguration== 2)、@EnableAutoConfigurat

spring boot啟動原理(包含自動配置解析

轉自:https://www.cnblogs.com/xiaoxi/p/7999885.html 我們開發任何一個Spring Boot專案,都會用到如下的啟動類 1 @SpringBootApplication 2 public class Application { 3 publ

Activiti5.22引數配置原始碼解析

package org.activiti.spring.boot; import org.activiti.spring.SpringProcessEngineConfiguration; /** * Interface to be implemented by a b

Vue-cli 命令列工具專案配置原始碼解析

我們都知道vue cli是vue.js 提供一個官方搭建專案命令列工具,可用於快速搭建大型單頁應用。以下是Vue-cli @2.9搭建專案的配置原始碼解析 相關目錄 ├── build │ ├── build.js │ ├── utils.js │ ├── check-versions

SpringBoot自動配置

介紹下開發環境 JDK版本1.8 springboot版本是1.5.2 開發工具為 intellij idea(2018.2) 開發環境為 15款MacBook Pro 結束語 增加自動配置 使用自動配置,我們需要配置的東西很少,也就新增下檔案