深入Spring IOC源码之ResourceLoader(四)

2014-11-24 10:36:20 · 作者: · 浏览: 5
e,否则返回false。

5. 如果pathArray没有遍历完,而pattArray遍历完了,返回false。

6. 如果pathArray和pattArray都没有遍历完,fullMatch为false,而且pattArray下一个字符串为”**”时,返回true。

7. 从后开始遍历pathArray和pattArray,如果遇到两个字符串不匹配,返回false,否则,直到遇到pattArray中的”**”字符串,或pathArray和pattArray中有一个和之前的遍历索引相遇。

8. 如果是因为pathArray与之前的遍历索引相遇,此时,如果没有遍历完的pattArray所有字符串都是”**”,则返回true,否则,返回false。

9. 如果pathArray和pattArray中间都没有遍历完:

a) 去除pattArray中相邻的”**”字符串,并找到其下一个”**”字符串,其索引号为pattIdxTmp,他们的距离即为s

b) 从剩下的pathArray中的第i个元素向后查找s个元素,如果找到所有s个元素都匹配,则这次查找成功,记i为temp,如果没有找到这样的s个元素,返回false。

c) 将pattArray的起始索引设置为pattIdxTmp,将pathArray的索引号设置为temp+s,继续查找,直到pattArray或pathArray遍历完。

10. 如果pattArray没有遍历完,但剩下的元素都是”**”,返回true,否则返回false。

对路径字符串数组中的字符串匹配算法如下:

1. 记pattern为模式字符串,str为要匹配的字符串,将两个字符串转换成两个字符数组pattArray和strArray。

2. 遍历pattArray直到遇到’*’字符。

3. 如果pattArray中不存在’*’字符,则只有在pattArray和strArray的长度相同两个字符数组中所有元素都相同,其中pattArray中的’ ’字符可以匹配strArray中的任何一个字符,否则,返回false。

4. 如果pattArray只包含一个’*’字符,返回true

5. 遍历pattArray和strArray直到pattArray遇到’*’字符或strArray遍历完,如果存在不匹配的字符,返回false。

6. 如果因为strArray遍历完成,而pattArray剩下的字符都是’*’,返回true,否则返回false

7. 从末尾开始遍历pattArray和strArray,直到pattArray遇到’*’字符,或strArray遇到之前的遍历索引,中间如果遇到不匹配字符,返回false

8. 如果strArray遍历完,而剩下的pattArray字符都是’*’字符,返回true,否则返回false

9. 如果pattArray和strArray都没有遍历完(类似之前的算法):

a) 去除pattArray相邻的’*’字符,查找下一个’*’字符,记其索引号为pattIdxTmp,两个’*’字符的相隔距离为s

b) 从剩下的strArray中的第i个元素向后查找s个元素,如果有找到所有s个元素都匹配,则这次查找成功,记i为temp,如果没有到这样的s个元素,返回false。

c) 将pattArray的起始索引设置为pattIdxTmp,strArray的起始索引设置为temp+s,继续查找,直到pattArray或strArray遍历完。

10. 如果pattArray没有遍历完,但剩下的元素都是’*’,返回true,否则返回false

String extractPathWithinPattern(String pattern, String path):

去除path中和pattern相同的字符串,只保留匹配的字符串。比如如果pattern为”/doc/csv/*.htm”,而path为”/doc/csv/commit.htm”,则该方法的返回值为commit.htm。该方法默认pattern和path已经匹配成功,因而算法比较简单:

以’/’分割pattern和path为两个字符串数组pattArray和pathArray,遍历pattArray,如果该字符串包含’*’或’ ’字符,则并且pathArray的长度大于当前索引号,则将该字符串添加到结果中。

遍历完pattArray后,如果pathArray长度大于pattArray,则将剩下的pathArray都添加到结果字符串中。

最后返回该字符串。

不过也正是因为该算法实现比较简单,因而它的结果貌似不那么准确,比如pattern的值为:/com/**/levin/**/commit.html,而path的值为:/com/citi/cva/levin/html/commit.html,其返回结果为:citi/levin/commit.html

现在言归正传,看一下PathMatchingResourcePatternResolver中的getResources方法的实现:

public Resource[] getResources(String locationPattern) throws IOException {

Assert.notNull(locationPattern, "Location pattern must not be null");

if (locationPattern.startsWith(CLASSPATH_ALL_URL_PREFIX)) {

// a class path resource (multiple resources for same name possible)

if (getPathMatcher().isPattern(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()))) {

// a class path resource pattern

return findPathMatchingResources(locationPattern);

}

else {

// all class path resources with the given name

return findAllClassPathResources(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()));

}

}

else {

// Only look for a pattern after a prefix here

// (to not get fooled by a pattern symbol in a strange prefix)