在上一篇 博文中有 提到 微內(nèi)核架構(gòu)下多租戶的實現(xiàn) ,接下來主要講解一下對應(yīng)的實現(xiàn)原理对碌。
SpringBoot 啟動時刷新上下文條件裝配流程
SpringBoot的啟動流程就不多做贅述,這次主要涉及到SpringBoot啟動時刷新上下文階段的內(nèi)容,所以提前把流程梳理一下。如圖所示:
可以按照流程圖進行debug ,就會發(fā)現(xiàn)
- 在解析配置階段 觸發(fā) @PluginCondition 注解 進行條件解析
- 在注冊Bean階段 進行 @ConditionalOnMissingBean 條件解析
@Conditional 注解的實現(xiàn)原理
@OnPluginCondition 自定義注解
根據(jù)上面的流程圖蒿偎,可以更細粒度的看一下 自定義@Conditional
注解的具體實現(xiàn)朽们。實現(xiàn)的代碼可以參考上一篇文章,接下來主要看一下 為什么 @PluginCondition
是在解析配置階段觸發(fā)。
我們根據(jù)流程圖往下看 ,首先調(diào)用了 ConditionEvaluator#shouldSkip(AnnotatedTypeMetadata)
方法酥郭,進而調(diào)用了內(nèi)部的方法 华坦。
剩下的邏輯實現(xiàn),可以翻看我前一篇文章愿吹,里面注釋寫的很清楚了不从。
@ConditionalOnMissingBean 注解的實現(xiàn)原理
了解了自定義的條件裝配注解之后 , SpringBoot默認的注解也就好理解了。我們先看一下 調(diào)用方法
接下來我們先來了解一下 @ConditionalOnMissingBean
注解的實現(xiàn)邏輯犁跪。首先基于條件裝配 OnBeanCondition.class
那么重點我們來看一下 OnBeanCondition
中的邏輯椿息。
這就是為什么在 調(diào)用ShouldSkip方法的時候, requiredPhase = REGISTER_BEAN坷衍。
我們往下看到關(guān)于 @ConditionalOnMissingBean
處理的部分
我們重點看一下 #getMatchingBeans
這個方法
小結(jié)
源碼原理我大部分以貼圖的形式展現(xiàn)寝优,這里可以更直觀的debug, 如果針對這方面的源碼還不是很理解,可以根據(jù)我的流程圖以及源碼圖自己打斷點枫耳,跟蹤一下源碼就可以理解這條件注解 @Conditional
的實現(xiàn)原理了乏矾。