SpringBoot實戰之SpringBoot自動配置原理

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

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

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

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

@EnableAutoConfiguration

@Enable*注釋并不是SpringBoot新發明的注釋,Spring 3框架就引入了這些注釋,用這些注釋替代XML配置文件。比如:
@EnableTransactionManagement注釋,它能夠聲明事務管理
@EnableWebMvc注釋,它能啟用Spring MVC
@EnableScheduling注釋,它可以初始化一個調度器。

這些注釋事實上都是簡單的配置,通過@Import注釋導入

從啟動類的@SpringBootApplication進入,在里面找到了@EnableAutoConfiguration,

1.png

2.png

@EnableAutoConfiguration里通過@Import導入了EnableAutoConfigurationImportSelector,

3.png

進入他的父類AutoConfigurationImportSelector

4.png

找到selectImports()方法,他調用了getCandidateConfigurations()方法,在這里,這個方法又調用了Spring Core包中的loadFactoryNames()方法。這個方法的作用是,會查詢META-INF/spring.factories文件中包含的JAR文件。

5.png

當找到spring.factories文件后,SpringFactoriesLoader將查詢配置文件命名的屬性。

6.png

7.png

Jar文件在org.springframework.boot.autoconfigure的spring.factories

8.png

spring.factories內容如下(截取部分),在這個文件中,可以看到一系列Spring Boot自動配置的列表

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\

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

RedisAutoConfiguration

redis.png

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

著重了解@Conditional注釋,Spring 4框架的新特性

此注釋使得只有在特定條件滿足時才啟用一些配置。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應用時,才會執行


2.Properties系列注釋

@EnableConfigurationProperties
@ConfigurationProperties(prefix = "may")

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

    @ConfigurationProperties(prefix = "may")  public class User {  private String name;  private String gender;  //省略setter,getter方法}  

application.yml中的配置

   mayname: youjiegender: man

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

    @ConfigurationProperties(prefix = "may",locations = "classpath:youjie.yml")  public class User2 {  private String name;  private String gender;  //省略setter,getter方法}

過時:由于Spring-boot 1.5.2版本移除了,locations這個屬性,因此上述這種方式在最新的版本中過時。
@PropertySource

Spring-boot 1.5.2版本之后,采用下面這種方式

@Component
//@PropertySource只能加載.properties文件,需要將上面的yml文件,改為.properties文件
@PropertySource("classpath:may.properties")
@ConfigurationProperties(prefix="may") 
public class User2 {  private String name;  private String gender;  //省略setter,getter方法}  

@EnableConfigurationProperties

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

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

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

config.png

總結

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

我們也可以定義自己的自動裝配組件,依賴之后,Spring直接可以加載我們定義的 starter 。筆者將在后續文章中進行編碼和解讀。



歡迎關注博主微信公眾號,更多技術分享

1211217-20180925131518525-420767372.png

轉載于:https://www.cnblogs.com/leihuazhe/p/7743479.html

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

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

相關文章

Install OpenCV-Python in Ubuntu

之前安裝python版opencv,需要下載whl文件,進行安裝,這是在window環境下的:安裝opencv_python,下載whl包安裝系統python下的opencv 今天發現一個簡單的方法。Install OpenCV-Python in UbuntuInstall package python-opencv with f…

如何健康地跑步?

最近某司高管跑步 28 公里后猝死,被各大媒體報道,每次這種悲劇發生,而且還跟跑步扯上關系,總是讓人心痛。通過報道了解到,這位高管酷愛跑馬拉松,身體素質和運動能力肯定是強于普通人的,但還是遭…

項目共享協調機制

API,協調前端與后端開發的連接點。 面臨幾個問題 1. API更新不及時,導致前端開發的接口沒有及時更新而出現各種問題。 2. 文檔描述得不準確 3. 沒有統一的標準。 我們可以使用swagger editor, swagger ui。第一是編輯器,第二個是展…

vs2008C1902程序數據庫管理不匹配

大清早打開vs2008,出現這么詭異的錯, 刪了一個dll的就好了。如圖

mysql user表 空_mysql 忘記密碼,重置密碼,mysql.user表為空的解決辦法

一、用戶表有用戶,直接修改密碼ERROR 1045 (28000): Access denied for user rootlocalhost (using password: YES)修改mysql配置文件my.cnf:vim /etc/my.cnf在[mysqld]中添加skip-grant-tables重啟mysql服務,用空密碼直接登錄,查…

鏈式封裝與調用

var CheckObject function(){}; CheckObject.prototype function(){checkName:function(){// codereturn this;},checkEmail:function(){// code return this;},checkPassword:function(){// codereturn this;} } //使用 var Check new CheckObject() Check.checkName().che…

全新升級的AOP框架Dora.Interception[3]: 基于特性標注的攔截器注冊方式

在Dora.Interception中按照約定方式定義的攔截器可以采用多種方式注冊到目標方法上。本篇文章介紹最常用的基于“特性標注”的攔截器注冊方式,下一篇會介紹另一種基于(Lambda)表達式的注冊方式:全新升級的AOP框架Dora.Interceptio…

在慘遭勒索病毒攻擊之后,微軟呼吁重新制定“數字日內瓦公約”

基于美國安全局泄露文檔開發的病毒程序成為上周的主要新聞,該病毒導致全世界大量的Windows電腦癱瘓。WannaCry勒索病毒在150個國家有20萬個受害者,包括英國的醫院、西班牙的基礎設施部門和俄羅斯的內政部。Renault在受到攻擊之后關閉了幾家在法國境內的工…

【代碼審計】PHP代碼審計---基礎記錄

PHP偽協議 PHP偽協議事實上是其支持的協議與封裝協議,支持的種類有以下12種。 * file:// — 訪問本地文件系統 * http:// — 訪問 HTTP(s) 網址 * ftp:// — 訪問 FTP(s) URLs * php:// — 訪問各個輸入/輸出流(I/O streams) * zlib:// — 壓…

全新升級的AOP框架Dora.Interception[4]: 基于表達式的攔截器注冊

基于特性標注的攔截器注冊方式僅限于將攔截器應用到自己定義的類型上,對于第三方提供的類型就無能為力了。對于Dora.Interception來說,攔截器注冊本質上建立攔截器與一個或者多個目標方法之間的映射,所以最笨的方式就是利用反射的方式得到表示…

mysql8.0.12插件_MySQL8.0.12 安裝及配置

MySQL8.0.12 安裝及配置發布時間:2018-08-07 10:39,瀏覽次數:274, 標簽:MySQL一.安裝1.從網上下載MySQL8.0.12版本,下載地址:https://dev.mysql.com/downloads/mysql/2. 下載完成后解壓我解壓的路徑是:D:\J…

python模塊之hashlib

hashlib模塊實現了多種安全哈希和信息摘要算法的通用接口,包括FIPS中定義的SHA1, SHA224, SHA256, SHA384, SHA512以及RFC 1321中定義的MD5 注意點:1. adler32及crc32哈希由zlib模塊提供2. 某些算法已知存在哈希碰撞弱點 哈希算法 每個hash算法都有一個同…

記一次阿里電面經歷

昨天下午(3/19)三點多鐘,接到了一個杭州的電話,是阿里的。問我是否方便聊聊。我說我在上課,四點下課。然后他就四點多鐘的時候又打了一次過來。項目經歷上來就問我有無大型項目的經歷。不好意思,我說無。。…

C語言程序設計第三次作業

(一)改錯題 計算f(x)的值:輸入實數x,計算并輸出下列分段函數f(x)的值,輸出時保留1位小數。 輸入輸出樣例1:   Enterr x: 10.0   f(10.0) 0.1 輸入輸出樣例2:   Enter x: 234   f(234.0…

mysql數據庫項目化教程鄭小蓉_MySQL數據庫項目化教程(高等職業教育“十三五”規劃教材(軟件技術專業))...

《MySQL數據庫項目化教程/高等職業教育十三五規劃教材(軟件技術專業)》是一本介紹MySQL數據庫基礎知識的入門教材,采用項目驅動方式循序漸進地介紹MySQL各個模塊的知識。主要內容包括:Windows下MySQL的安裝,MySQL服務的啟動與停止&#xff0c…

WPF-09 ManualResetEventSlim信號量

業務場景如下:WPF應用程序后臺有個定時任務在接收PLC硬件數據(該線程接收完數據之后, 會重新啟動一個新線程繼續接收.....),當應用程序關閉時, 我們得確保接收PLC硬件數據的線程完成之后,再關閉應用程序,否則會造成數據丟失。上面的業務場景是…

【bzoj3033】太鼓達人 DFS歐拉圖

題目描述 給出一個整數K,求一個最大的M,使得存在一個每個位置都是0或1的圈,圈上所有連續K位構成的二進制數兩兩不同。輸出最大的M以及這種情況下字典序最小的方案。 輸入 一個整數K。 輸出 一個整數M和一個二進制串,由一個空格分隔…

Redis 集合處理

學習了列表之后,發現了Redis處理字符串的功能強大。 為了適應不同場景的需求,還有一個用的很多的就是集合。 Redis提供的集合支持的類型是字符串。并且集合中的元素值是唯一的,也就是說不能出現重復數據。 而且,集合的實現是通過哈…

fpga mysql_FPGA的一些瑣碎知識整理

1.生產FPGA的廠家有:ALTERAXILINXATCELLatticeps:Altera和Xilinx主要生產一般用途FPGA,其主要產品采用SRAM工藝Actel主要提供非易失性FPGA,產品主要基于反熔絲工藝和FLASH工藝ps: 熔絲,顧名思義:把絲熔掉,反…

使用增量備份修復DG中的GAP

問題描述 oracle中DG出現主備不同步現象,alert日志報警有gap信息,但是v$archive_gap視圖查不到任何信息。同時主庫上的對應歸檔已經刪除且沒有備份 解決方案 1.查詢備庫的scn SQL> select current_scn from v$database; 這時有可能出來的scn是以科學計…