1. 程式人生 > >springboot——springboot的自動配置原理

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:測試