dubbo源码分析7——dubbo的配置解析_与spring的整合

Posted 源码王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dubbo源码分析7——dubbo的配置解析_与spring的整合相关的知识,希望对你有一定的参考价值。

dubbo的配置其实就是建立在spring的命名空间的配置机制之上的。在dubbo的jar包的META-INF目录下会有spring.handlers这个文件,用来配置spring的命名空间和解析类的对应关系。打开spring.handlers文件,可知dubbo的命名空间配置的处理类为com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler,代码:

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 DubboBeanDefinitionParser(AnnotationBean.class, true));
    }

DubboBeanDefinitionParser类的parse方法会处理所有的配置,具体入口就是上面这段代码。DubboBeanDefinitionParser类的parse方法的解析的目的就是把dubbo的命名空间上的配置转成相应的BeanDefinition类,以便IOC容器进行后续的实例化和注入工作。解析逻辑大致如下:

 1.  RootBeanDefinition beanDefinition = new RootBeanDefinition();    //创建BeanDefinition实例

 2.  beanDefinition.setBeanClass(beanClass);                                      //设置这个beanDefinition要实例化的类,又称beanClass, 此处的beanClass,就是上面摘录的源码中的DubboBeanDefinitionParser类的构造方法中的第一个参数

 3.  通过beanDefinition设置bean的id ,这个逻辑多一些,直接列源码,在上面注释说明

     String id = element.getAttribute("id");  //先获取元素的id属性作为bean的id 
        if ((id == null || id.length() == 0) && required) {
            String generatedBeanName = element.getAttribute("name");  //如果没有id属性,则获取元素的name属性
            if (generatedBeanName == null || generatedBeanName.length() == 0) { //如果name属性也没设,那么如果这个解析的beanClass是ProtocolConfig.class,一般对应的xml元素是 <dubbo:protocol>,那么id为dubbo,也就说明默认protocol为dubbo
                if (ProtocolConfig.class.equals(beanClass)) {
                    generatedBeanName = "dubbo";
                } else {                                                       //如果name属性没设,且不是ProtocolConfig.class这个情况,则获取interface属性作为id      
                    generatedBeanName = element.getAttribute("interface");
                }
            }
            if (generatedBeanName == null || generatedBeanName.length() == 0) {//如果name属性、interface属性都没设置,且也不是ProtocolConfig.class那么就直接取beanClass的类名作为id
                generatedBeanName = beanClass.getName();
            }
            id = generatedBeanName; 
            int counter = 2;
            while(parserContext.getRegistry().containsBeanDefinition(id)) {
                id = generatedBeanName + (counter ++);                        //对id做防重处理
            }
        }

 

4. 当前如果解析的是<dubbo:protocol>,把当前解析的beandefinition设置到其他的已注册的beandefinition中

if (ProtocolConfig.class.equals(beanClass)) {
            for (String name : parserContext.getRegistry().getBeanDefinitionNames()) {
                BeanDefinition definition = parserContext.getRegistry().getBeanDefinition(name);
                PropertyValue property = definition.getPropertyValues().getPropertyValue("protocol");
                if (property != null) {
                    Object value = property.getValue();
                    if (value instanceof ProtocolConfig && id.equals(((ProtocolConfig) value).getName())) {
                        definition.getPropertyValues().addPropertyValue("protocol", new RuntimeBeanReference(id));
                    }
                }
            }
        }

 

以上是关于dubbo源码分析7——dubbo的配置解析_与spring的整合的主要内容,如果未能解决你的问题,请参考以下文章

Dubbo源码分析之XML的Bean解析

Dubbo 源码解析07_Dubbo 重试机制

Dubbo配置参数源码解析-group

Dubbo 源码解析06_Dubbo 服务调用

Apache Dubbo 服务发布源码分析

Apache Dubbo 服务发布源码分析