當前位置:成語大全網 - 書法字典 - SpringBoot核心原則:自動配置、事件驅動、條件。

SpringBoot核心原則:自動配置、事件驅動、條件。

SpringBoot是春天的包裝。SpringBoot可以通過自動配置開箱即用,上手成本非常低。但是學習其實現原理的成本大大增加,需要先了解彈簧原理。

如果妳不知道彈簧的原理,可以先查看博主之前的文章。本文主要分析SpringBoot的啟動、自動配置、條件和事件驅動原理。

SpringBoot的啟動非常簡單,因為它內置了Tomcat,所以只需通過以下方式啟動:

妳可以看到第壹種是最簡單和最常用的方法。您需要註意類上的註釋@SpringBootApplication,這是自動配置的核心實現。我們稍後再分析。讓我們來看看SpringBoot是如何開始的。

在往下走之前,讓我們猜測壹下run方法中需要做什麽。對比Spring的源代碼,我們知道Spring的啟動總是會創建壹個ApplicationContext的ApplicationContext對象,並調用其refresh方法來啟動容器。SpringBoot只是Spring的壹個外殼,這樣的操作當然是無法避免的。

另壹方面,過去由Spring構建的項目都需要作為War包發布到Tomcat。現在,Tomcat已經內置到SpringBoot中,它只需要作為壹個Jar包啟動,因此相應的Tomcat對象肯定會在run方法中創建和啟動。以上只是我們的猜測。讓我們驗證它並輸入運行方法:

SpringBoot的啟動過程就是這個方法。我們先來看看getRunListeners方法。該方法用於獲取SpringApplicationRunListener的所有實現類,這些類用於發布SpringBoot事件。我們稍後將分析事件驅動程序,這裏我們主要看壹下該方法的實現原理:

壹步壹步地,我們可以看到相應的實現類最終從meta-INF/spring加載和實例化。通過SPI機制根據接口類型對Factors文件進行自動配置,也實現了SpringBoot的自動配置。

為什麽要這麽做?不能用標註掃描嗎?當然不是。這些類都在第三方jar包中,實現標註掃描非常麻煩。當然,也可以通過@Import導入註釋,但這種方法不適合有大量擴展類的情況,因此這裏使用SPI的優勢顯而易見。

回到run方法,您可以看到createApplicationContext方法被調用,這是為了創建應用程序上下文對象:

請註意,壹個新的未知上下文對象AnnotationConfigServletWebServiceApplicationContext由反射實例化,這是SpringBoot的擴展。看看它的建造方法:

如果妳看過Spring註釋驅動的實現原理,這兩個對象肯定會很熟悉,壹個支持註釋解析,另壹個用於掃描包。

壹旦創建了上下文,下壹步自然是調用refresh方法來啟動容器:

將首先調用其父類中的ServletWebserveApplicationContext:

您可以看到它被直接委托給父類:

這個方法不陌生吧?之前已經分析過了,這裏就不贅述了。此時,SpringBoot的容器啟動了,但Tomcat從哪裏啟動呢?我在run方法中也沒有看到。

事實上,Tomcat的啟動也在刷新過程中。該方法的壹個步驟是調用onRefresh方法,這是Spring中未實現的模板方法,SpringBoot通過該方法完成了Tomcat的啟動:

這裏,我們首先獲取TomcatServletWebServerFactory對象,然後通過該對象創建並啟動Tomcat:

上面的每壹步都可以與Tomcat的配置文件進行比較。需要註意的是,默認情況下只有E方法也是模板方法,具體的匹配邏輯是在該方法中實現的。此方法返回的ConditionOutcome對象包含兩個字段:是否匹配和日誌消息。輸入OnBeanCondition類:

可以看到這個類支持@ ConditionalOnBean、@ ConditionalOnSingleCandidate和@ ConditionalOnMissingBean等註釋。主要的匹配邏輯在getMatchingBeans方法中:

這裏的邏輯看起來很復雜,但實際上,已經做了兩件事。第壹,豆制品廠。getbeannamesforType由getNamesOfBeansIgnoredByType方法調用,以獲取容器中相應的bean實例,然後bean根據返回的結果存在。哪些bean不存在(可以在Condition註釋中配置多個值)並返回MatchResult對象,而在MatchResult中,只要有壹個Bean不匹配,就會返回false,從而確定當前Bean是否需要實例化。

本文分析了SpringBoot核心原理的實現,相信讀者通過本文將能夠更加熟練地使用和擴展SpringBoot。

此外,還有壹些我沒有分析的常用組件,例如事務、MVC和偵聽器的自動配置。如果我們有Spring源代碼的基礎,我們就會理解它,所以我在這裏不贅述。

最後,讀者可以思考我們應該如何定制啟動器。我相信妳讀完這篇文章應該不難。