在使用dubbo时常常会遇到如下配置:
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:reference id="demoService" check="false" interface="org.apache.dubbo.samples.basic.api.DemoService"/>
</beans>
<dubbo:reference />是dubbo自定义的标签,这些标签是如何转换成Spring Bean对象的呢?
在dubbo.jar的META-INF
目录下有两个文件spring.schemas
、spring.handlers
2.7.0 版本中的spring.schemas文件内容如下:
http\://dubbo.apache.org/schema/dubbo/dubbo.xsd=META-INF/dubbo.xsd
http\://code.alibabatech.com/schema/dubbo/dubbo.xsd=META-INF/compat/dubbo.xsd
内容格式为 key-value,key为dubbo的schema文件,value表示该文件的实际路径
在配置文件中引入dubbo标签时需要指定具体的schema文件,其值就是key
2.7.0 版本中的spring.handlers文件内容如下:
http\://dubbo.apache.org/schema/dubbo=org.apache.dubbo.config.spring.schema.DubboNamespaceHandler
http\://code.alibabatech.com/schema/dubbo=org.apache.dubbo.config.spring.schema.DubboNamespaceHandler
文件内容格式为key-value,key为dubbo的命名空间,value为该命名空间对应的处理逻辑类
在配置文件中引入dubbo标签时需要指定dubbo命名空间,其值就是key
根据http\://dubbo.apache.org/schema/dubbo=org.apache.dubbo.config.spring.schema.DubboNamespaceHandler
可知,dubbo标签的解析入口就是DubboNamespaceHandler.java
在DubboNamespaceHandler.init()
中注册标签对应的BeanDefinitionParser
public void init() {
// ...
this.registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
this.registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
// ...
}
看到这里我们知道dubbo标签的解析逻辑在DubboBeanDefinitionParser
中
调用BeanDefinitionParser
接口中的parse
方法创建BeanDefinition
对象