springboot——springboot的自動配置原理
在我們使用springboot的時候,感覺很方便,它提倡的 '習慣優於配置' 給開發人員帶來了很大的方便。但是當一些小白在使用的時候,經常不理解是如何實現自動配置的。
在spring中提供了一種基於條件來配置bean的方式來實現bean的配置。其實springboot也基於了這個來實現。
spring基於條件配置bean
spring提供了條件註解@Conditional,該註解根據滿足某一個條件來實現建立一個特定的bean。
例項:下面例項將以不同的作業系統為條件來建立不同的bean。我們將通過實現Condition介面,並重寫其matches方法來構建判斷條件。
1:定義判斷條件:
2:不同系統下要實現的bean
3:配置類的實現
程式碼解釋:
@configuration註解配置類,通過@Conditional註解,符合哪個條件則建立對應的bean
4:執行測試
springboot執行原理
關於springboot的執行原理,我們可以通過檢視@SpringBootApplication註解,這個註解是一個組合註解,它的核心功能是有@EanbleAutoConfiguration註解提供的。
看下@EanbleAutoConfiguration的原始碼:
原始碼裡面可以看出,這是一個組合註解,其中關鍵功能是@Import註解的匯入配置功能。EnableAutoConfigurationImportSelector使用SpringFctoriesLoader.loadFactoryNames方法來掃描具有META-INF/spring.factories檔案,此檔案中聲名了有哪些自動配置。
核心註解
springboot的執行原理看起來很簡單,其實還有很多核心的註解。
其實開啟spring.factories檔案中隨便哪一個自動配置,都可以發現有很多註解,尤其是上面說到的基於條件來建立bean的註解的使用。
以上的註解其實都是組合了@Condition註解,只是傳入不同的條件類。
案列分析
通過以上的瞭解,現在我們來找一個案列來分析一下springboot是如何實現自動配置的。我們來分析一下http編碼的自動配置。
常規配置http編碼,是在web.xml當中配置一個filter:
實現springboot自動配置:
1:配置引數,型別安全配置的方式。
springboot有型別安全配置。springboot的自動配置也是基於了這一點。這裡的配置類裡面的引數可以直接在application.properties中設定。
原始碼如下:
2:配置bean
實戰
通過上面的理解,我們可以寫一個簡單的例子來測一下。這裡舉一個簡單的例子,包含當某個類存在的時候自動配置這個類的bean,並可將該bean的屬性在applicationg.peoperties中進行配置。
首先要建立starter的maven專案。
並且在pom檔案中要增加springboot的自動配置的依賴。
1:屬性配置類,型別安全配置,可在application.properties中配置引數。
型別安全的配置,在application.properties中通過hello.msg來配置msg引數的值。預設為hello.msg=world。
2:判斷依據類。
3:自動配置類
通過註解@EnableConfigurationProperties開始屬性配置,可以在appicationg.properties中配置HelloServiceProperties類的引數。
通過註解@ConditionalOnClass判斷HelloService.class在類路徑下條件時。
通過註解@ConditionalOnProperty判斷當在application.properties中設定hello=enabled設定條件符合,預設為true,也是條件符合。
4:注入配置類
如果想要是自動配置生效,在分析springboot執行原理的時候我們就知道了,需要在METE-INF/spring.factories中註冊配置類。
5:測試