Springboot之spring-boot-autoconfigure模塊

一、前言

Spring的出現(xiàn)給我們管理bean的依賴注入提供了便捷,但是當(dāng)我們需要使用通過pom引入的jar里面的一個bean時候,還是需要手動在xml配置文件里面主要注入的bean 。springboot則可以依據(jù)classpath里面的依賴內(nèi)容來自動配置bean到IOC容器,Auto-configuration會嘗試推斷哪些beans是用戶可能會需要的。比如如果HSQLDB包在當(dāng)前classpath下,并且用戶并沒有配置其他數(shù)據(jù)庫鏈接,這時候Auto-configuration功能會自動注入一個基于內(nèi)存的數(shù)據(jù)庫連接到應(yīng)用的IOC容器。但是要開啟這個自動配置功能需要添加@EnableAutoConfiguration注解。

Auto-configuration使用在class上標(biāo)注@Configuration注解實現(xiàn),并且使用@Configuration的時候一般帶有一定的約束,比如同時還在class上標(biāo)注了 @ConditionalOnClass(當(dāng)前classpath下存在類) 和@ConditionalOnMissingBean(當(dāng)前IOC容器不存在bean)注解。這保證了classpath下存在一些相關(guān)的類并且需要的bean還沒有被注入到IOC時候auto-configuration才生效。

二、一個例子-web容器的自動配置

本節(jié)通過web容器創(chuàng)建的過程來分析下Auto-configuration是如何實現(xiàn)自動掃描裝載的。


image.png
  • EmbeddedServletContainerAutoConfiguration類是web容器的Auto-configuration類。
  • @ConditionalOnWebApplication說明當(dāng)前是web環(huán)境上下文時候才注入本類到IOC。
  • 對應(yīng)tomcat來說它的核心代碼里面需要Servlet.class, Tomcat.class這兩個類,所以 @ConditionalOnClass({ Servlet.class, Tomcat.class })說明如果當(dāng)前classpath的jar里面含有Servlet.class, Tomcat.class這兩個類,才進(jìn)入下一個條件的判斷, @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)說明當(dāng)前IOC容器里面是否沒有EmbeddedServletContainerFactory的實例,如果兩個條件都滿足則會創(chuàng)建TomcatEmbeddedServletContainerFactory實例到IOC容器。
  • 對應(yīng)Jetty來說它的核心代碼里面需要Servlet.class, Server.class, Loader.class,WebAppContext.class,所以@ConditionalOnClass({ Servlet.class, Server.class, Loader.class,WebAppContext.class })是看當(dāng)前classpath的jar里面是否含有這些類,這些類存在進(jìn)入下一個條件看當(dāng)前IOC容器里面是否沒有EmbeddedServletContainerFactory的實例。

當(dāng)應(yīng)用引入spring-boot-starter-web時候默認(rèn)是引入的是tomcat的start,所以會發(fā)現(xiàn)classpath下存在Servlet.class, Tomcat.class這兩個類,并且IOC里面沒有EmbeddedServletContainerFactory的實例,所以會創(chuàng)建TomcatEmbeddedServletContainerFactory到IOC。如果你需要使用Jetty則需要在引用spring-boot-starter-web的時候排除掉tomcat的start,然后在引入jetty的start即可。

注:JettyEmbeddedServletContainerFactory和TomcatEmbeddedServletContainerFactory都實現(xiàn)了EmbeddedServletContainerFactory接口。

三、總結(jié)

springboot的spring-boot-autoconfigure模塊通過靈活的Auto-configuration注解使SpringBoot中的功能實現(xiàn)模塊化和可被替換擴(kuò)展。spring-boot-autoconfigure思路類似SPI(Service Provider Interface),都是不同的實現(xiàn)類實現(xiàn)了定義的接口,加載時候去查找classpath下的實現(xiàn)類,不同在于前者使用autoconfigure實現(xiàn)后者使用的是ServiceLoader。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,279評論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,644評論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,740評論 18 399
  • 最近先生在減肥,特別注重吃的東西,信心滿滿地想通過節(jié)食和運(yùn)動來達(dá)到效果。我很支持他,但也會暗暗覺得是否有點(diǎn)太過細(xì)致...
    不要蔥花兩個雞蛋閱讀 293評論 0 1
  • 今天做的高興的事情是,中午讓孩子們有條不紊的去學(xué)習(xí)了,而且在四年級試了試我的課,其實我明天下午還要再把我的課試一下...
    馬上做閱讀 186評論 0 0

友情鏈接更多精彩內(nèi)容