基于SpringBoot 多租户扩展插件组件原理

在上一篇 博文中有 提到 微内核架构下多租户的实现 ,接下来主要讲解一下对应的实现原理。

SpringBoot 启动时刷新上下文条件装配流程

SpringBoot的启动流程就不多做赘述,这次主要涉及到SpringBoot启动时刷新上下文阶段的内容,所以提前把流程梳理一下。如图所示:

条件装配

可以按照流程图进行debug ,就会发现

  • 在解析配置阶段 触发 @PluginCondition 注解 进行条件解析
  • 在注册Bean阶段 进行 @ConditionalOnMissingBean 条件解析

@Conditional 注解的实现原理

@OnPluginCondition 自定义注解

根据上面的流程图,可以更细粒度的看一下 自定义@Conditional 注解的具体实现。实现的代码可以参考上一篇文章,接下来主要看一下 为什么 @PluginCondition 是在解析配置阶段触发。

我们根据流程图往下看 ,首先调用了 ConditionEvaluator#shouldSkip(AnnotatedTypeMetadata) 方法,进而调用了内部的方法 。

PluginCondition1.png

PluginCondition2.png

剩下的逻辑实现,可以翻看我前一篇文章,里面注释写的很清楚了。

@ConditionalOnMissingBean 注解的实现原理

了解了自定义的条件装配注解之后 , SpringBoot默认的注解也就好理解了。我们先看一下 调用方法

missBeanShouldSkip1.png
missBeanShouldSkip2.png

接下来我们先来了解一下 @ConditionalOnMissingBean 注解的实现逻辑。首先基于条件装配 OnBeanCondition.class

missBean1.png

那么重点我们来看一下 OnBeanCondition 中的逻辑。

missBean2.png

这就是为什么在 调用ShouldSkip方法的时候, requiredPhase = REGISTER_BEAN。

我们往下看到关于 @ConditionalOnMissingBean 处理的部分

missBean3.png

我们重点看一下 #getMatchingBeans 这个方法

missBean4.png

missBean5.png
missBean6.png
missBean7.png
missBean8.png

小结

源码原理我大部分以贴图的形式展现,这里可以更直观的debug, 如果针对这方面的源码还不是很理解,可以根据我的流程图以及源码图自己打断点,跟踪一下源码就可以理解这条件注解 @Conditional 的实现原理了。

你可能感兴趣的:(基于SpringBoot 多租户扩展插件组件原理)