Dubbo源码分析(一)如何与Spring进行集成

Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

这是Dubbo的一个简单介绍,第一篇首先讲一下Dubbo是如何和Spring框架进行无缝集成的。在我们进行Spring-Dubbo项目开发的时候,需要通过XML来配置,比如


那么Spring是如何对这个配置处理从而转化成整个容器里可以拿来使用的Bean那?
在Spring处理xml文件的时候会根据命名空间来判断是否是默认的,如importbeans。对于非Spring默认的会来进行如下的代码执行:

public BeanDefinitionparseCustomElement(Element ele, BeanDefinition containingBd) {
   String namespaceUri = getNamespaceURI(ele);
   NamespaceHandler handler =this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
   if (handler ==null) {
error("Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri +"]", ele);
return null;
   }
return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));
}

首先根据namespaceUri 来寻找实现了NamespaceHandler的handler,然后在这个resolve() 方法中完成handler的init()初始化。我们可以来看看实现了NamespaceHandler的DubboNamespaceHandler中init方法都做了什么。

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));
   }

在parsers 中注册了很多的BeanDefinitionParser来进行Dubbo的XML配置中节点解析。在DubboBeanDefinitionParser中的parse()方法根据beanClass的不同完成不同bean的属性装配。

你可能感兴趣的:(Dubbo源码分析(一)如何与Spring进行集成)