⑴ SpringBoot的自動裝配(一)
一、什麼是SpringBoot的自動裝配
SpringBoot的自動裝配是指:SpringBoot會自動將一些配置類的bean注冊到ioc容器,我們可以在需要的地方使用@Autowired或@Resource等註解來使用它。
自動的表現形式就是我們只需要引我們享用功能的包,其他的配置完全不需要管,springboot會自動注入這些配置備案,我們直接使用就行。
自動裝配也是SpringBoot的一個重要的特點,他幫我們做了很多的配置。
二、它是怎樣實現的?
1、run方法
當啟動一個SpringBoot項目時,本質上就是執行了地洞累中的主方法,然後執行了run方法。
這個對象就是 ApplicationContext介面的一個子介面。
其實SpringBoot項目的啟動,本質上就是一個Spring的初始化操作。
2、@SpringBootApplication
點開這個註解可以發現,這是一個組合註解,包括:
這些註解中,前四個是JDK中的自動元註解,是用來修飾註解的註解。@ComponentScan是用來掃描路徑的,如果不置頂特定的掃描路徑的話,掃描的路徑是當前修飾的類所在的包及其子包。而@SpringBootConfiguration這個註解的本質就是@Configuration註解。所以在這裡面跟SpringBoot自動裝配有關系的就只有一個了:@EnableAutoConfiguration
3、@EnableAutoConfiguration
@AutoConfigurationPackage不是用來實現自動裝配的,在Spring中,他是用來掃描實體類Entity等註解的。所以重點是在@Import上。
@Import註解實現了類,自動裝配也是在這個類中進行了具體的實現。自動裝配實現的就是該類中的selectImports方法里。通過selectImports方法,取到spring.factories文件下的一系列類名,隨後將這些類自動載入至IOC容器中。
4、總結
SpringBoot的自動裝配也就是通過@EnableAutoConfiguration註解,載入類中的selectImports方法,進而掃描spring.factories文件下的自動配置類,並將其裝配到IOC容器的過程。
⑵ 你所理解的SpringBoot的自動配置是什麼
SpringBoot採用**約定大於配置設計思想**,將所有可能遇到的配置信息提前配置好,寫在自動配置的jar包中。每個Starter基本都會有對應的自動配置。
這意味著:日後我們在開發Spring應用程序的過程中,需要的配置項,由Pivotal團隊的開發人員,幫我們寫好了。怎麼實現的?主要是通過@Configuration聲明的配置類來實現。
SpringBoot幫我們將配置信息寫好,存放在一個jar包中:spring-boot-autoconfigure-2.1.11.RELEASE.jar,jar包里存放的都是配置類,以及讓配置類生效的"規則類"。
自動配置是SpringBoot中比較深奧的內容,相信你看完我的解釋,肯定懵懵懂懂;就去黑馬程序員官網視頻庫看免費視頻。
⑶ SpringBoot入門-自動配置詳解
通過查看SpringBootApplication的源碼,會發現這是一個組合註解,其中最重要的註解是@EnableAutoConfiguration
先看@AutoConfigurationPackage這個註解
裡面導入了一個Registrar類,這個類實現了bean的掃描與注冊,那它掃描的是哪個包呢?
只要看PackageImports這個類,會發現如果沒有用@ComponentScan指定包名,他默認掃描的是啟動類的包名,比如你的啟動類是cn.hollycloud.App,它掃描的就是cn.hollycloud
再來看這個類,這個類用來載入所有的自動配置項
通過上面的源碼我們知道spring把所有配置項都導進來了,但我們並不需要所有的功能。比如說我開發的時候並不需要mongodb相關功能,但spring也會把相關配置項載入進來,怎麼關閉該功能呢?看下mongodb的自動配置源碼
重點是@ConditionalOnClass(MongoClient.class),這個的意思是只有類路徑中存在MongoClient.class,也就是我們導入mongo相關依賴,這個配置項才會開啟,否則不會注冊這個bean。
同時我們看下面有個MongoClient的bean,spring很貼心地為我們初始化好了mongo的客戶端,我們直接使用就行了,如果想自定義客戶端怎麼辦呢?也很簡單,直接自己初始化一個mongo客戶端放入spring容器就行了,@ConditionalOnMissingBean的意思是如果你沒有自定義客戶端它才會自己生成一個,是不是很方便,這個叫條件化註解
現在我們來實現一個簡單的自動配置類來鞏固下。
可以想像一下我們是一家機器人公司,專門製造高端機器人,很受客戶歡迎,但是配置機器人過於復雜,這點老是被客戶詬病,你的領導想讓你提供給客戶開機即用的產品,該如何實現呢?
首先我們創建一個機器人控制終端,這是控制終端可以操控機器人說話
接下來是自動配置項,可以自動注冊配置終端
我們想要給客戶一點自由,可以讓客戶自由配置機器人的名字和顏色,而不用管機器內部復雜的操作
接下來最重要的一步是把自動配置項放到類路徑的/META-INF/spring.factories裡面
然後客戶直接引用你提供的依賴就能直接控制機器人了,而不用管復雜的初始化操作
來控制機器人說話吧,直接注入robot就能使用了,不需要客戶關心復雜的初始化操作了
如果客戶想為機器人改個名字也很簡單,直接在application.yml配置下就行了
這個例子雖然很簡單,但是說明了自動配置的工作原理,spring內置的自動配置雖然復雜,但原理都一樣的。
參考代碼: https://gitee.com/huatin/java-test 下的AutoConfigTest模塊