今天在查看Spring的PathMatchingResourcePatternResolver类代码时,有调用到ClassLoader.getResources()方法,
忽然发现一直没弄清 ClassLoader.getResources() 在什么时候会返回多于1个URL?
能否举个简单的例子 谢谢!
[b]问题补充:[/b]
刚才试了一下,发现如果类路径上有重复的资源,getResource()方法会返回类路径上碰到的第一个资源。
而getResources()则会返回当前类加载器路径上的所有重复资源以及父类加载器上的所有重复资源。
比如,在tomcat\lib目录下放置一个zip文件,包含config/aaa.txt文件,
在WEB-INF/lib目录下复制一份这个zip文件,
再在src目录下放上config/aaa.txt文件,
getResource("config/aaa.txt")返回结果是:
file:/D:/eclipse/workspace/demo/WebContent/WEB-INF/classes/config/aaa.txt
getResources("config/aaa.txt")返回结果是:
file:/D:/eclipse/workspace/demo/WebContent/WEB-INF/classes/config/aaa.txt
jar:file:/D:/apache-tomcat-6.0.16/lib/aaaaa.jar!/config/aaa.txt
jar:file:/D:/eclipse/workspace/demo/WebContent/WEB-INF/lib/bbbbb.jar!/config/aaa.txt
看看它的源码
public Enumeration<URL> getResources(String name) throws IOException {
Enumeration[] tmp = new Enumeration[2];
//先调用父类加载器加载资源
if (parent != null) {
tmp[0] = parent.getResources(name);
} else {
tmp[0] = getBootstrapResources(name);
}
//转到findResources方法,这个方法是让子类自己去实现的,也就是返回自定义的资源路径
tmp[1] = findResources(name);
return new CompoundEnumeration(tmp);
}
public Enumeration getResources(String name)
throws IOException查找所有给定名称的资源。资源是可以通过类代码以与代码位置无关的方式访问的某些数据(图像、声音、文本等)。
资源名称是以 '/' 分隔的标识资源的路径名称。
getResource(String) 的文档中描述了搜索顺序。
参数:
name - 资源名称
返回:
资源的 URL 对象的枚举。如果找不到资源,则该枚举将为空。类加载器无权访问的资源不在此枚举中。
ClassLoader.getResources() 只能返回一个URL啊.
没有搞清楚你要问什么