dubbo2.x xml配置的消费者bean对象注入容器的过程

本文试图去阐述ddubbo消费者的对象注入容器的过程。本文并未完成,后续会继续补充

基础知识

  1. spring标签自定义
  2. FactoryBean使用
  3. jdk动态代理

解析流程

  • 由于使用了spring自定注解,从META-INF/spring.handlers,找到自定义注解命名空间定义类com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class DubboNamespaceHandler extends NamespaceHandlerSupport {

    static {
    Version.checkDuplicate(DubboNamespaceHandler.class);
    }

    @Override
    public void init() {
    registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
    registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
    registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
    registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));
    registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
    registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
    registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
    registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
    registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
    registerBeanDefinitionParser("annotation", new AnnotationBeanDefinitionParser());
    }
    }
    所有解析流程都在:com.alibaba.dubbo.config.spring.schema.DubboBeanDefinitionParser#parse方法中进行。

bean对象的获取

  • 通过上次分析可知从spring容器中获取的对象为com.alibaba.dubbo.config.spring.ReferenceBean, 从源代码中截取了部分代码
    1
    2
    public class ReferenceBean<T> extends ReferenceConfig<T> implements FactoryBean, ApplicationContextAware, InitializingBean, DisposableBean {
    }
    由于实现了org.springframework.beans.factory.FactoryBean,所以bean对象最终获取对象为com.alibaba.dubbo.config.spring.ReferenceBean#getObject

进一步深入getObject方法,可以看到:com.alibaba.dubbo.config.ReferenceConfig#init中进行了代理对象生成