Dubbo配置文件的解析

本文介绍了Dubbo的配置文件,包括provider、consumer和registry中的beans标签,详细讲解了配置文件的解析过程。当spring容器启动时,它会加载并解析resources下的dubbo配置文件,依据http://dubbo.apache.org/schema/dubbo找到对应的DubboNameSpaceHandler。在解析配置文件过程中,DefaultNamespaceHandlerResolver.resolve()方法被调用,通过NameSpaceHandler解析配置,注册BeanDefinition。


注:
以下内容解析会涉及到Spring容器的加载过程,所以需要对spring容器的启动过程有所了解。

Dubbo的配置文件

dubbo的配置文件,provider、consumer,registry中均是以 beans 标签的形式存在的,beans标签中中包含的是具体的dubbo类型标签。详细请看下面的文件

<?xml version="1.0" encoding="UTF-8"?>
<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-4.3.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <dubbo:application name="exercise-consumer"/>

    <dubbo:reference id="teaQueryRemote" interface="com.tigerwow.tealife.api.TeaQueryRemote"
                     check="false" registry="tea-life-registry" timeout="20000"/>

</beans>

Dubbo项目中 META-INF包下的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

配置文件的解析

  • 1、spring容器在启动的时候会加载解析 resources 下的dubbo配置文件,同时会根据dubbo配置文件中的 http://dubbo.apache.org/schema/dubbo 找到 dubbo包下META-INF下的对应的DubboNameSpaceHandler.java
  • 2、在加载读取配置文件注册bean的过程中,会调用DefaultNamespaceHandlerResolver.resolve(String namespaceUri)
	public NamespaceHandler resolve(String namespaceUri) {
		Map<String, Object> handlerMappings = getHandlerMappings();
		Object handlerOrClassName = handlerMappings.get(namespaceUri);
		if (handlerOrClassName == null) {
			return null;
		}
		else if (handlerOrClassName instanceof NamespaceHandler) {
			return (NamespaceHandler) handlerOrClassName;
		}
		else {
			String className = (String) handlerOrClassName;
			try {
				Class<?> handlerClass = ClassUtils.forName(className, this.classLoader);
				if (!NamespaceHandler.class.isAssignableFrom(handlerClass)) {
					throw new FatalBeanException("Class [" + className + "] for namespace [" + namespaceUri +
							"] does not implement the [" + NamespaceHandler.class.getName() + "] interface");
				}
				NamespaceHandler namespaceHandler = (NamespaceHandler) BeanUtils.instantiateClass(handlerClass);
				
				// 这里会调用 DubboNameSpaceHandler.init();
				namespaceHandler.init();
				
				handlerMappings.put(namespaceUri, namespaceHandler);
				return namespaceHandler;
			}
			catch (ClassNotFoundException ex) {
				throw new FatalBeanException("Could not find NamespaceHandler class [" + className +
						"] for namespace [" + namespaceUri + "]", ex);
			}
			catch (LinkageError err) {
				throw new FatalBeanException("Unresolvable class definition for NamespaceHandler class [" +
						className + "] for namespace [" + namespaceUri + "]", err);
			}
		}
	}
  • 获取到具体的NameSpaceHandler之后,根据解析出来的Element,init()中注册的解析器进行解析配置文件,返回具体的BeanDifinition;
	public BeanDefinition parseCustomElement(Element ele, @Nullable BeanDefinition containingBd) {
		String namespaceUri = getNamespaceURI(ele);
		if (namespaceUri == null) {
			return null;
		}
		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));
	}

参考文章:https://blog.youkuaiyun.com/u010942020/article/details/79252920

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值