这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战
首先分享之前的所有文章 , 欢迎点赞收藏转发三连下次一定 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164…
Github : 👉 github.com/black-ant
CASE 备份 : 👉 gitee.com/antblack/ca…
一 . 前言
先看总结更高效!!!🎁🎁🎁
这一篇来看一看 @DubboService 标注的类是如何扫描和使用的 , 扫描逻辑如下 :
1 | java复制代码// 之前我们就了解到 , Dubbo 通过 PostProcessor 在初始化中做二次处理 , Dubbo 中主要有以下 PostProcessor |
二 . DubboServicer 加载
2.1 基础案例
1 | java复制代码@DubboService |
2.2 扫描的入口
Dubbo 的扫描同样是通过 BeanPostProcess 进行处理的 , 主要处理类为 ServiceAnnotationPostProcessor ,
在 SpringBoot 加载的时候 , 通过 refresh 的 invokeBeanFactoryPostProcessors 逻辑发起处理
1 | JAVA复制代码// 发起扫描 C- ServiceAnnotationPostProcessor |
补充 : postProcessBeanDefinitionRegistry 方法
postProcessBeanDefinitionRegistry 方法是 BeanDefinitionRegistryPostProcessor 接口的唯一方法 , 该方法可以通过 BeanDefinitionRegistry 自定义的注册 Bean .
2.3 Bean 的扫描 (ServiceAnnotationPostProcessor)
1 | java复制代码// Step 2-1 : 扫描 Bean |
PRO0001 补充一 : DubboClassPathBeanDefinitionScanner 的占用
1 | java复制代码 |
PRO0002 补充二 : resolveBeanNameGenerator 的作用
1 | java复制代码String CONFIGURATION_BEAN_NAME_GENERATOR = "org.springframework.context.annotation.internalConfigurationBeanNameGenerator" |
PRO0003 补充三 : AnnotationTypeFilter 处理了哪些 ?
1 | java复制代码private final static List<Class<? extends Annotation>> serviceAnnotationTypes = asList( |
补充四 : ServicePackagesHolder 的作用
1 | java复制代码public class ServicePackagesHolder { |
补充五 : findServiceBeanDefinitionHolders 处理 Service
1 | java复制代码 |
2.4 BeanDefinition 的处理
前面会对 BeanDefinitionHolder 进行Bean 处理 ,之前已经了解到这个对象中有2个set 集合
1 | java复制代码// BeanDefinition 加载主流程 C- ServiceAnnotationPostProcessor |
Step 1 : 解析接口名
这里分别会从三个属性中尝试获取 : interfaceName / interfaceClass / Class 上面获取
1 | Java复制代码// 从@Service注释属性解析服务接口名称 |
Step 2 : 构建 buildServiceBeanDefinition
1 | JAVA复制代码// C- ServiceAnnotationPostProcessor |
Step 3 : 注册 Bean
1 | JAVA复制代码// C- ServiceAnnotationPostProcessor |
三 . BeanDefinition 的使用
上文对 BeanDefinition 进行了扫描 , 这一轮来简单看一下这些扫描构建的对象是怎么进行注册的
上文在 generateServiceBeanName 时生成了一个 ServiceBean:org.apache.dubbo.demo.DemoService 的 Bean , 这个 Bean 是非常重要的 .
1 | java复制代码// 在 AbstractApplicationContext # refresh 中 , |
此处可以观察到 , Bean 已经在里面了
总结
啥也不说了 , 看图
简单来说就是扫描Bean后 ,生成特殊的Bean融入容器体系中 , 后续通过 Spring 来加载
看了这么多框架 , Dubbo 对 Spring 的使用已经达到很深的底层了, 就好像看 Spring 源码一样 .
这才叫用框架呀~
本文转载自: 掘金