美文网首页方案中间件
【dubbo源码】5.配置信息解析-注解版

【dubbo源码】5.配置信息解析-注解版

作者: 天还下着毛毛雨 | 来源:发表于2021-07-02 18:52 被阅读0次

    入口

    @EnableDubbo(scanBasePackages = "com.lb.dubbo_api.service.impl")
    @PropertySource("dubbo.properties")
    public class AnnoBean {
    }
    
    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对象中。

    image

    后期会把配置信息弄到dubbo 配置类中.

    @EnableDubbo :启用dubbo配置

    该注解上还有@DubboComponentScan,@EnableDubboConfig,这两个注解是dubbo用注解与spring集成的核心了

    image

    1. @EnableDubboConfig

    该注解用@import导入了DubboConfigConfigurationRegistrar这个类

    image

    DubboConfigConfigurationRegistrar 实现了ImportBeanDefinitionRegistrar接口,那么spring在实例化的时候会调用DubboConfigConfigurationRegistrar重写ImportBeanDefinitionRegistrar接口的registerBeanDefinitions方法,并且将用@Import导入DubboConfigConfigurationRegistrar的类的元数据包装成importingClassMetadata对象。

    image

    其实就是为了获取入口类AnnoBean上的@EnableDubboConfig注解里的multiple属性配置的值,默认是true.

    然后注册了两个DubboConfigConfiguration的内部类

    • DubboConfigConfiguration.Single.class
    • DubboConfigConfiguration.Multiple.class

    通过读Class对象注册到ioc容器

    image
    DubboConfigConfiguration.Single

    类上有@EnableDubboConfigBindings,值为@EnableDubboConfigBinding数组
    通过绑定,将有对应前缀的配置信息赋值到对应的配置类中

    • dubbo.application
    • dubbo.module
    • dubbo.registry
    • dubbo.protocol
    • dubbo.monitor
    • dubbo.provider
    • dubbo.consumer
    image
    @EnableDubboConfigBindings

    又用@Import导入DubboConfigBindingsRegistrar类,DubboConfigBindingsRegistrar这个类又实现了ImportBeanDefinitionRegistrar,EnvironmentAware接口


    image

    实现ImportBeanDefinitionRegistrar肯定是为了另外导入一些类,并且拿到导入的源类,获取源类上配置的信息

    实现EnvironmentAware是为了拿到spring的environment对象,因为dubbo.properties已经被@PropertySource注解机制加载到了environment.MutablePropertySources中,在这里只对beanName的创建有作用。

    image

    registrar.registerBeanDefinitions :

    image

    注册的过程中,需要从environment对象中拿dubbo相关的配置,比如ApplicationConfig只拿
    dubbo.application.*相关的配置,然后创建ApplicationConfig的BeanDefinition.

    image

    如果 @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
    

    之后还会注册一个BeanPostProcessor类型的DubboConfigBindingBeanPostProcessor类的beanDefinition,BeanPostProcessor类型 会在每一个Bean实例化的过程中,根据配置的前缀,从environment拿出所需的配置,根据beanName来处理beanName相同的这一个配置Bean,把配置信息绑定到配置类的属性中。

    image
    DubboConfigBindingBeanPostProcessor绑定属性到配置Bean中

    DubboConfigBindingBeanPostProcessor.postProcessBeforeInitialization

    image

    利用 dubboConfigBinder 对象来绑定前缀为dubbo.application的配置信息到配置Bean中

    image

    这里dubboConfigBinder对象是DubboConfigBindingBeanPostProcessor中的一个属性,是在因为这个类实现了InitializingBean这个接口的afterPropertiesSet方法,dubboConfigBinder对象就是在这里初始化的

    image

    最后用的DataBinder的api把一个MutablePropertyValues绑定到Bean的属性

    image

    2. @DubboComponentScan

    @import进来了DubboComponentScanRegistrar类

    image

    DubboComponentScanRegistrar又实现了ImportBeanDefinitionRegistrar接口,实现registerBeanDefinitions方法.

    跟xml的逻辑一样,同样是

    1. 注册ServiceAnnotationBeanPostProcessor,用于扫描@Service注解的服务,只不过要扫描的包从@EnableDubbo注解里获取

    2. 注册ReferenceAnnotationBeanPostProcessor,用于所有的bean中有@Reference 注解的属性注入

    image

    总结 :

    1. @PropertySource把配置信息读到spring环境中
    2. @EnableDubbo 上有两个注解
      1. @EnableDubboConfig
        的作用是注册配置信息同类型对应的配置类,并把环境中的配置根据key对应的设置到配置Bean的field中


        image
      2. @DubboComponentScan
        1. 注册ServiceAnnotationBeanPostProcessor用来扫@Service注解的服务类,扫到之后变成BeanDefinition弄到spring容器中等待实例化
        2. 注册ReferenceAnnotationBeanPostProcessor在所有bean实例化的过程中,检查是否含有@Reference的field或者method,进行属性注入。

    相关文章

      网友评论

        本文标题:【dubbo源码】5.配置信息解析-注解版

        本文链接:https://www.haomeiwen.com/subject/lmlyultx.html