【dubbo源码】配置信息解析-注解版
转自:https://www.jianshu.com/p/2feba6cbb799
参考:https://blog.csdn.net/qq_29064815/article/details/103067208
参考:https://blog.csdn.net/weixin_42103620/article/details/119140375
入口
1 @EnableDubbo(scanBasePackages = "com.lb.dubbo_api.service.impl") 2 @PropertySource("dubbo.properties") 3 public class AnnoBean { 4 }
dubbo.properties :
dubbo.application.name=dubbo-p dubbo.registry.address=zookeeper://maomaoyu.xyz:2181
@PropertySource("dubbo.properties")
用于把dubbo.properties读到spring的environment中,
这个工作是由Spring的ConfigurationClassPostProcessor类来完成的.检测到某个需要注册的Bean上有@PropertySource注解,就会读该文件的配置信息,弄到environment对象的MutablePropertySources对象中。
![](https://img2022.cnblogs.com/blog/1000464/202210/1000464-20221020165026585-1565282105.webp)
后期会把配置信息弄到dubbo 配置类中.
@EnableDubbo :启用dubbo配置
该注解上还有@DubboComponentScan,@EnableDubboConfig,这两个注解是dubbo用注解与spring集成的核心了
![](https://img2022.cnblogs.com/blog/1000464/202210/1000464-20221020165938065-122321726.webp)
其实就是为了获取入口类AnnoBean上的@EnableDubboConfig注解里的multiple属性配置的值,默认是true.
然后注册了两个DubboConfigConfiguration的内部类
- DubboConfigConfiguration.Single.class
- DubboConfigConfiguration.Multiple.class
通过读Class对象注册到ioc容器
![](https://img2022.cnblogs.com/blog/1000464/202210/1000464-20221020170038212-1384329707.webp)
DubboConfigConfiguration.Single
类上有@EnableDubboConfigBindings,值为@EnableDubboConfigBinding数组
通过绑定,将有对应前缀的配置信息赋值到对应的配置类中
- dubbo.application
- dubbo.module
- dubbo.registry
- dubbo.protocol
- dubbo.monitor
- dubbo.provider
- dubbo.consumer
![](https://img2022.cnblogs.com/blog/1000464/202210/1000464-20221020170124047-2001842213.webp)
@EnableDubboConfigBindings
又用@Import导入DubboConfigBindingsRegistrar类,DubboConfigBindingsRegistrar这个类又实现了ImportBeanDefinitionRegistrar,EnvironmentAware接口
![](https://img2022.cnblogs.com/blog/1000464/202210/1000464-20221020170359627-188823625.webp)
实现ImportBeanDefinitionRegistrar肯定是为了另外导入一些类,并且拿到导入的源类,获取源类上配置的信息
实现EnvironmentAware是为了拿到spring的environment对象,因为dubbo.properties已经被@PropertySource注解机制加载到了environment.MutablePropertySources中,在这里只对beanName的创建有作用。
![](https://img2022.cnblogs.com/blog/1000464/202210/1000464-20221020170428077-455971920.webp)
registrar.registerBeanDefinitions :
dubbo.application.*相关的配置,然后创建ApplicationConfig的BeanDefinition.
![](https://img2022.cnblogs.com/blog/1000464/202210/1000464-20221020170618711-2074933454.webp)
如果 @EnableDubboConfigBinding配置的multiple为true(默认为false),并且在配置文件中配置了同样前缀的属性,如:
dubbo.application.name=dubbo-p dubbo.application.name.test=dubbo-p // 中间一定要用 .隔开
这样会为同一种配置类型,生成两个BD.beanName不同的配置Bean,名称规则如下所示, #0表示的是'.'在配置的key中出现的位置
com.alibaba.dubbo.config.ApplicationConfig#0
com.alibaba.dubbo.config.ApplicationConfig#1
![](https://img2022.cnblogs.com/blog/1000464/202210/1000464-20221020170945131-457679106.webp)
DubboConfigBindingBeanPostProcessor绑定属性到配置Bean中
DubboConfigBindingBeanPostProcessor.postProcessBeforeInitialization
![](https://img2022.cnblogs.com/blog/1000464/202210/1000464-20221020171007709-1495961042.webp)
利用 dubboConfigBinder 对象来绑定前缀为dubbo.application的配置信息到配置Bean中
![](https://img2022.cnblogs.com/blog/1000464/202210/1000464-20221020171225766-996393366.webp)
最后用的DataBinder的api把一个MutablePropertyValues绑定到Bean的属性
![](https://img2022.cnblogs.com/blog/1000464/202210/1000464-20221020171249465-1294814043.webp)
2. @DubboComponentScan
@import进来了DubboComponentScanRegistrar类
DubboComponentScanRegistrar又实现了ImportBeanDefinitionRegistrar接口,实现registerBeanDefinitions方法.
跟xml的逻辑一样,同样是
-
注册ServiceAnnotationBeanPostProcessor,用于扫描@Service注解的服务,只不过要扫描的包从@EnableDubbo注解里获取
-
注册ReferenceAnnotationBeanPostProcessor,用于所有的bean中有@Reference 注解的属性注入
![](https://img2022.cnblogs.com/blog/1000464/202210/1000464-20221020171341552-626950760.webp)
总结 :
- @PropertySource把配置信息读到spring环境中
- @EnableDubbo 上有两个注解
-
@EnableDubboConfig
的作用是注册配置信息同类型对应的配置类,并把环境中的配置根据key对应的设置到配置Bean的field中
-
![](https://img2022.cnblogs.com/blog/1000464/202210/1000464-20221020171409835-988483645.webp)
- 注册ServiceAnnotationBeanPostProcessor用来扫@Service注解的服务类,扫到之后变成BeanDefinition弄到spring容器中等待实例化
- 注册ReferenceAnnotationBeanPostProcessor在所有bean实例化的过程中,检查是否含有@Reference的field或者method,进行属性注入。
相关文章
- JBoss7安装、测试、配置和启动以及停止,部署
- 第五章 配置系统信息
- Spring Boot Dubbo applications.properties 配置清单
- mybatis简单基础配置
- springmvc中针对一个controller方法配置两个url请求
- 《深入浅出MySQL:数据库开发、优化与管理维护(第2版)》一一第 1 章 MySQL的安装与配置
- dubbo高级配置学习(上)
- tsconfig配置详解
- 集群下Dubbo负载均衡配置
- SpringBoot三种配置Dubbo的方式
- Mac 上的 GLFW 环境配置
- jenkins配置从git指定分支下载代码,打包部署jar包
- Synergy 多系统共享鼠标键盘 Windows 和 Mac 完全配置教程
- maven学习笔记五(仓库搭建,私服配置)