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

被折叠的 条评论
为什么被折叠?



