spring boot相比spring之是以簡化很多就是因為spring boot搭建一個項目的時候可以引入多個starter,這樣就可以直接使用不需要過多的各種配置。spring官方提供了不少starter,而我們自己也可以自定義starter,為了能夠區分,從命名上進行了規範。官方的starter名稱為:spring-boot-starter-xxx,而自定義的為xxx-spring-boot-starter。
spring boot能夠幫助我們簡化開發主要就是基于它提供的起步依賴和自動配置。
起步依賴其實就是我們在maven裡面寫的依賴坐标,這樣可以簡化将具備某種功能的坐标打包一起導入。
自動配置是spring boot的核心重點,spring-boot-starter這個東西本質就是spring boot的自動配置。自動配置,就是無須手動配置xml,自動配置并管理bean,可以簡化開發過程。自動配置有如下幾個關鍵的步驟:
基于Java代碼的Bean配置
自動配置條件依賴
Bean參數擷取
Bean的發現
Bean的加載
下面來通過我們常用的一個starter例子mybatis-spring-boot-starter來講述以下自動配置的實作過程。
基于Java代碼的Bean配置
當我們通過maven導入mybatis-spring-boot-starter這個jar的坐标後,可以看到這個jar下面包括了很多相關的jar,如圖:

我們可以點開mybatis-spring-boot-autoconfigure 這個jar包 ,可以從這個包名autoconfigure看出這個包是自動配置的意思,見名知意我們想要探究的自動配置原理就在這個包下面。我們照下圖點開裡面的MybatisAutoConfiguration 這個自動配置類:
我們從類中截取關鍵的代碼來看看:
可以看出,這個類裡有很多注解,确實自動配置的實作原理基本就是靠這些注解來展開的。
@Configuration和@Bean這兩個注解一起使用就可以建立一個基于java代碼的配置類,可以用來替代傳統的xml配置檔案。
@Configuration 表明這個類是一個配置類,這個注解的類可以看作是能生産讓Spring IoC容器管理的Bean執行個體的工廠,也就是這個類裡可以執行個體化對象并放在spring容器裡,替代的就是以往的xml配置檔案。
@Bean 注解的含義是方法傳回的對象可以被注冊到spring容器中,也就是會執行個體化一個對象放在spring容器裡面 。
是以上圖的MybatisAutoConfiguration這個類,自動幫我們生成了SqlSessionFactory和SqlSessionTemplate這些Mybatis的重要執行個體并交給spring容器管理,進而完成bean的自動注冊。
自動配置條件依賴
從MybatisAutoConfiguration這個類中使用的注解可以看出,不光有@Configuration和@Bean這兩個注解,還有其他的注解,而這些注解就是要完成自動配置的依賴條件。
這兩個注解的含義就是要完成Mybatis的自動配置,需要在類路徑中存在SqlSessionFactory.class、SqlSessionFactoryBean.class這兩個類,同時需要存在DataSource這個bean也就是DataSource這個對象需要注入進去且這個bean完成自動注冊。
下面列舉一些常見的條件依賴注解:
注解 | 功能說明 |
---|---|
@ConditionalOnBean | 僅在目前上下文中(spring容器)存在某個bean時,才會執行個體化這個Bean |
@ConditionalOnClass | 某個class位于類路徑上,才會執行個體化這個Bean |
@ConditionalOnExpression | 當表達式為true的時候,才會執行個體化這個Bean |
@ConditionalOnMissingBean | 僅在目前上下文中(spring容器)不存在某個bean時,才會執行個體化這個Bean |
@ConditionalOnMissingClass | 某個class在類路徑上不存在的時候,才會執行個體化這個Bean |
@ConditionalOnNotWebApplication | 不是web應用時才會執行個體化這個Bean |
@AutoConfigureAfter | 在某個bean完成自動配置後執行個體化這個bean |
@AutoConfigureBefore | 在某個bean完成自動配置前執行個體化這個bean |
Bean參數擷取
在項目中我們的mybatis通過spring boot完成自動配置是需要我們在在配置檔案中提供資料源相關的配置參數,例如資料庫驅動、連接配接url、資料庫使用者名、密碼等等。下面就來看看spring boot是如何讀取yml或者properites配置檔案的的屬性來建立資料源對象的。
我們導入mybatis-spring-boot-starter這個jar包時也會同步導入一個spring-boot-autoconfigure包,點開這個包下的jdbc檔案夾中有一個一個自動配置類DataSourceAutoConfiguration,如圖:
這個自動配置類中加了@EnableConfigurationProperties注解,這個注解的含義就是啟用配置屬性,就是啟用括号裡面的類中的屬性,我們點開括号中的類:
可以看到這個類上加入了@ConfigurationProperties注解,這個注解的作用就是把yml或者properties配置檔案中的配置參數資訊封裝到@ConfigurationProperties注解标注的bean(即DataSourceProperties)的相應屬性上。
@EnableConfigurationProperties注解的實際作用就是使@ConfigurationProperties注解生效。
Bean的發現
spring boot預設掃描啟動類所在的包下的主類與子類的所有元件,但并沒有包括依賴包也就是各種starter中的類,下面就來看看starter中的bean都是如何被發現的。
我們所建立的Spring Boot項目啟動類中一般會加上@SpringBootApplication注解,我們就從這個注解點進去看看bean被發現的步驟:
點進去後可以看到如上三個重要注解:
@SpringBootConfiguration:作用就相當于@Configuration注解,被注解的類将成為一個bean配置類,表明其實啟動類本質也是一個配置類。
@ComponentScan:作用就是自動掃描并加載符合條件的元件,但是不會掃描我們所加入的starter依賴包,最終将這些bean加載到spring容器中。
@EnableAutoConfiguration :含義就是啟用自動配置,有了這個注解就可以自動将依賴中的bean建立出來。
是以我們要想知道bean是如何被發現的@EnableAutoConfiguration這個注解很重要,繼續點進這個注解:
@EnableAutoConfiguration注解引入了@Import這個注解,這個注解為導入需要自動配置的元件,後面跟了一個EnableAutoConfigurationImportSelector 這個類,我們點進去看看:
EnableAutoConfigurationImportSelector繼承了AutoConfigurationImportSelector類也就是個選擇器類,繼續跟蹤AutoConfigurationImportSelector類源碼:
項目啟動的時候我們spring boot架構會自動調用上圖這個方法getCandidateConfigurations意思為擷取候選配置項也就是從我們引入的jar包中去擷取一些配置,而這個方法中又調用了SpringFactoriesLoader類的loadFactoryNames方法,繼續跟蹤源碼:
我們可以看到SpringFactoriesLoader的loadFactoryNames靜态方法可以從我們所有引入的jar包中讀取META-INF/spring.factories檔案,而自動配置的類的位置路徑就在這個檔案中進行配置:
spring.factories檔案内容如下:
這樣Spring Boot就可以通過讀取META-INF/spring.factories檔案找到MybatisAutoConfiguration這個配置類的加載位置進而加載到MybatisAutoConfiguration這個配置類了,然後從配置類中發現bean。
Bean的加載
就是通過spring boot将一個普通類執行個體化然後交給Spring容器管理,通常有以下方法:
在Spring Boot應用中要讓一個普通類交給Spring容器管理,通常有以下方法:
1、使用 @Configuration與@Bean 注解
2、使用@Controller @Service @Repository @Component 注解标注該類并且啟用@ComponentScan自動掃描
3、使用@Import 方法
其中Spring Boot實作自動配置使用的是@Import注解這種方式,上面我們也講解過AutoConfigurationImportSelector類的selectImports方法傳回一組從META-INF/spring.factories檔案中讀取的bean的全類名,這樣Spring Boot就可以加載到這些Bean并完成執行個體的建立工作。
總結
我們可以将自動配置的關鍵幾步以及相應的注解總結如下:
1、@Configuration與@Bean:基于Java代碼的bean配置
2、@Conditional:設定自動配置條件依賴
3、@EnableConfigurationProperties與@ConfigurationProperties:讀取配置檔案轉換為bean
4、@EnableAutoConfiguration與@Import:實作bean發現與加載
以上就是本次對spring boot自動配置starter完整過程的探究,後面會通過自定義starter來進一步鞏固對自動配置starter的了解和應用。