7、 Dubbo与spring融合

spring中bean的定义可以通过编程,可以定义在properties文件,也可以定义在通过xml文件中,用的最多的是通过xml形式,由于xml格式具有很好的自说明便于编写及维护。对于xml的文档结构、数据定义及格式验证可以通过DTD和Schema, 在spring2.0之前采用的是DTD,在spring2.0之后采用Schema。使用Schema方式使得spring更加便于与第三方进行集成以及第三方可以提供更简单更便于使用的个性化配置方式。对于XmlSchema具体知识这里不做介绍,但是Schema中有个重要的概念命名空间(namespace)必须要提一下,spring就是利用它来做第三方自定配置格式的解析的,在spring中aop, transaction的就是给第三一个实现自己自定义配置很好实例。

类DefaultBeanDefinitionDocumentReader会把spring的xml配置文件当做一个文档格式来读取此文档主要讲解dbbo的自定义处理器DubboNamespaceHandler来怎样把dubbo自定义的元素转换成的bean定义并注册到spring的容器中去的。

public void init() {
        //配置<dubbo:application>标签解析器 
        registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
        //配置<dubbo:module>标签解析器 
        registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
        //配置<dubbo:registry>标签解析器 
        registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
        //配置<dubbo:monitor>标签解析器 
        registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));
        //配置<dubbo:provider>标签解析器 
        registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
        //配置<dubbo:consumer>标签解析器 
        registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
        //配置<dubbo:protocol>标签解析器
        registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));

DubboNamespaceHandler中注册了这么多的BeanDefinitionParser用来解析dubbo定义的那些xml元素节点如:

<dubbo:application name="dubbo-admin" />

<dubbo:registry address="${dubbo.registry.address}" check="false"file="false" />

<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />

<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" />

各个BeanDefinitionParser会把上面的xml元素转换成spring内部的数据结构BeanDefinition,最终当被引用时实例化成对应的bean如<dubbo:application/>节点得到ApplicationConfig.

当然通过默认配置方式也是可以的如:

<dubbo:registry address="${dubbo.registry.address}" check="false" file="false" />

也可以配置成

<bean id=” registry”class=” com.alibaba.dubbo.config.RegistryConfig”/>

       <property name=” address” value=” ${dubbo.registry.address}”/>

       <property name=” check” value=” false”/>

<property name=” file” value=” false”/>

<bean/>

利用自定义元素解析更加简洁,同时也可以屏蔽一些具体的实现类型,如你不需要知道com.alibaba.dubbo.config.RegistryConfig这个类,只需要知道注册registry这个元素就可以了,用户可以通过文档以及schema的在ide中的自动提示可以很方便的去配置。

猜你喜欢

转载自kuanghe.iteye.com/blog/2388319