同步操作将从 huifer/Code-Analysis 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
类全路径: org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver
类图
public class DefaultNamespaceHandlerResolver implements NamespaceHandlerResolver {
/**
* The location to look for the mapping files. Can be present in multiple JAR files.
*
* 默认的 spring handler 映射信息存储的位置
*/
public static final String DEFAULT_HANDLER_MAPPINGS_LOCATION = "META-INF/spring.handlers";
/** Logger available to subclasses. */
protected final Log logger = LogFactory.getLog(getClass());
/**
* ClassLoader to use for NamespaceHandler classes.
* 类加载器
*
* */
@Nullable
private final ClassLoader classLoader;
/**
* Resource location to search for.
* spring handler 映射位置.
* */
private final String handlerMappingsLocation;
/**
* Stores the mappings from namespace URI to NamespaceHandler class name / instance.
*
* key : 命名空间uri
* value: 字符串或者实例
*
* */
@Nullable
private volatile Map<String, Object> handlerMappings;
}
在成员变量中有一个静态变量DEFAULT_HANDLER_MAPPINGS_LOCATION
在变量中表示了默认的 命名空间处理器的一些信息. 我们打开对应文件进行阅读
http\://www.springframework.org/schema/c=org.springframework.beans.factory.xml.SimpleConstructorNamespaceHandler
http\://www.springframework.org/schema/p=org.springframework.beans.factory.xml.SimplePropertyNamespaceHandler
http\://www.springframework.org/schema/util=org.springframework.beans.factory.xml.UtilNamespaceHandler
通过阅读这段内容在结合成员变量的handlerMappings
大致可以了解到这个类有一部分操作时将META-INF/spring.handlers
文件读取并放到handlerMappings
下面我们就开始对方法进行分析
方法签名: org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver#resolve
resolve
方法是NamespaceHandlerResolver
接口定义的方法, 在本类(DefaultNamespaceHandlerResolver
)中实现, 先来看看这个方法做了什么
笔者对 resolve
进行一个流程说明
获取命名空间处理器的映射表(key:namespace uri , value: namespaceHandlerClassName , namespaceHandlerInstance)
从命名空间处理器映射表中根据 参数获取值.
此时值有3种情况
不存在
类型是 NamespaceHandler
类型是字符串
当属于字符串类型时会有下面操作
init
@Override
@Nullable
public NamespaceHandler resolve(String namespaceUri) {
// 获取 namespace handler 映射表
Map<String, Object> handlerMappings = getHandlerMappings();
// 从映射表中获取 uri 对应的 handler
// 1. 字符串(名称)
// 2. 实例
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 = (NamespaceHandler) BeanUtils.instantiateClass(handlerClass);
// 初始化
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);
}
}
}
resolve
方法中第一行就是读取handlerMapping资源. 这一段也就映射到我们这篇文章开始提到的DEFAULT_HANDLER_MAPPINGS_LOCATION
变量和handlerMappings
变量org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver#getHandlerMappings
一个文件加载的过程就不给各位展开细说了.
private Map<String, Object> getHandlerMappings() {
// 设置容器
Map<String, Object> handlerMappings = this.handlerMappings;
if (handlerMappings == null) {
synchronized (this) {
handlerMappings = this.handlerMappings;
if (handlerMappings == null) {
if (logger.isTraceEnabled()) {
logger.trace("Loading NamespaceHandler mappings from [" + this.handlerMappingsLocation + "]");
}
try {
// 读取 资源文件地址
Properties mappings =
PropertiesLoaderUtils.loadAllProperties(this.handlerMappingsLocation, this.classLoader);
if (logger.isTraceEnabled()) {
logger.trace("Loaded NamespaceHandler mappings: " + mappings);
}
handlerMappings = new ConcurrentHashMap<>(mappings.size());
// 数据合并, 将 mappings 数据拷贝给 handlerMappings
CollectionUtils.mergePropertiesIntoMap(mappings, handlerMappings);
this.handlerMappings = handlerMappings;
}
catch (IOException ex) {
throw new IllegalStateException(
"Unable to load NamespaceHandler mappings from location [" + this.handlerMappingsLocation + "]", ex);
}
}
}
}
return handlerMappings;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。