WEB开发网
开发学院软件开发Java Spring源码学习-含有通配符路径解析(上) 阅读

Spring源码学习-含有通配符路径解析(上)

 2012-05-24 09:29:39 来源:WEB开发网   
核心提示:} if (logger.isDebugEnabled()) { logger.debug("Resolved location pattern [" + locationPattern + "] to resources " + result); } return re
}
if (logger.isDebugEnabled()) {
logger.debug("Resolved location pattern [" + locationPattern + "] to resources " + result);
}
return result.toArray(new Resource[result.size()]);
}
此方法传入的完整的没有处理的路径,从第一行开始,就开始分步处理解析传入的路径,首先是决定“根”路径: determineRootDir(locationPattern)
/**
* Determine the root directory for the given location.
* <p>Used for determining the starting point for file matching,
* resolving the root directory location to a <code>java.io.File</code>
* and passing it into <code>retrieveMatchingFiles</code>, with the
* remainder of the location as pattern.
* <p>Will return "/WEB-INF/" for the pattern "/WEB-INF/*.xml",
* for example.
* @param location the location to check
* @return the part of the location that denotes the root directory
* @see #retrieveMatchingFiles
*/
protected String determineRootDir(String location) {
int prefixEnd = location.indexOf(":") + 1;
int rootDirEnd = location.length();
while (rootDirEnd > prefixEnd && getPathMatcher().isPattern(location.substring(prefixEnd, rootDirEnd))) {
rootDirEnd = location.lastIndexOf('/', rootDirEnd - 2) + 1;
}
if (rootDirEnd == 0) {
rootDirEnd = prefixEnd;
}
return location.substring(0, rootDirEnd);
}
这个“根”,就是不包含通配符的最长的部分,以我们的路径为例,这个“根”本来应该是: D:\\workspace-home\\spring-custom\\src\\main\\resources\\spring\\ ,但是实际上,从determineRootDir的实现可以看出:

首先,先找到冒号:索引位,赋值给 prefixEnd 。


然后,在从冒号开始到最后的字符串中,循环判断是否包含通配符,如果包含,则截断最后一个由"/"分割的部分,例如:在我们路径中,就是最后的ap?-context.xml这一段。再循环判断剩下的部分,直到剩下的路径中都不包含通配符。
如果查找完成后,rootDirEnd=0了,则将之前赋值的prefixEnd的值赋给rootDirEnd,也就是":"所在的索引位。


最后,将字符串从开始截断rootDirEnd。


我们的问题,就出在关键的第二步,Spring这里只在字符串中查找"/",并没有支持"\\"这样的路径分割方式,所以,自然找不到"\\",rootDirEnd = -1 + 1 = 0。所以循环后,阶段出来的路径就是D: ,自然Spring会找不到配置文件,容器无法初始化。


基于以上分析,我们将路径修改为:D:/workspace-home/spring-custom/src/main/resources/spring/ap?-context.xml,
测试通过。


刚才仅仅分析了,我们之前路径的问题所在,还有一点我想也是大家关心的,就是通配符是怎么匹配的呢?那我们就继续分析源码,回到 findPathMatchingResources 方法。


将路径分成包含通配符和不包含的两部分后,Spring会将根路径生成一个Resource,用的还是getResources方法。然后检查根路径的类型,是否是Jar路径?是否是VFS路径?对于我们这种普通路径,自然走到最后的分支。
/**
* Find all resources in the file system that match the given location pattern

上一页  1 2 3 4 5 6  下一页

Tags:Spring 源码 学习

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接