在上一篇 博文中有 提到 微内核架构下多租户的实现 ,接下来主要讲解一下对应的实现原理。
SpringBoot 启动时刷新上下文条件装配流程
SpringBoot的启动流程就不多做赘述,这次主要涉及到SpringBoot启动时刷新上下文阶段的内容,所以提前把流程梳理一下。如图所示:
可以按照流程图进行debug ,就会发现
- 在解析配置阶段 触发 @PluginCondition 注解 进行条件解析
- 在注册Bean阶段 进行 @ConditionalOnMissingBean 条件解析
@Conditional 注解的实现原理
@OnPluginCondition 自定义注解
根据上面的流程图,可以更细粒度的看一下 自定义@Conditional
注解的具体实现。实现的代码可以参考上一篇文章,接下来主要看一下 为什么 @PluginCondition
是在解析配置阶段触发。
我们根据流程图往下看 ,首先调用了 ConditionEvaluator#shouldSkip(AnnotatedTypeMetadata)
方法,进而调用了内部的方法 。
剩下的逻辑实现,可以翻看我前一篇文章,里面注释写的很清楚了。
@ConditionalOnMissingBean 注解的实现原理
了解了自定义的条件装配注解之后 , SpringBoot默认的注解也就好理解了。我们先看一下 调用方法
接下来我们先来了解一下 @ConditionalOnMissingBean
注解的实现逻辑。首先基于条件装配 OnBeanCondition.class
那么重点我们来看一下 OnBeanCondition
中的逻辑。
这就是为什么在 调用ShouldSkip方法的时候, requiredPhase = REGISTER_BEAN。
我们往下看到关于 @ConditionalOnMissingBean
处理的部分
我们重点看一下 #getMatchingBeans
这个方法
小结
源码原理我大部分以贴图的形式展现,这里可以更直观的debug, 如果针对这方面的源码还不是很理解,可以根据我的流程图以及源码图自己打断点,跟踪一下源码就可以理解这条件注解 @Conditional
的实现原理了。