Spring 类路径前缀差异

这是 给你的文件

此特殊前缀指定所有 类路径资源匹配 必须获得给定的名称 (在内部,这种情况基本上会发生 通过 ClassLoader.getResources (...) 调用) ,然后合并为 最终应用上下文定义。

有人能解释一下吗?

使用 classpath*:conf/appContext.xml和使用没有星号的 classpath:conf/appContext.xml有什么区别。

70618 次浏览

当您希望使用通配符语法从多个 bean 定义文件构建应用程序上下文时,classpath*:...语法非常有用。

例如,如果您使用 classpath*:appContext.xml构造上下文,那么类路径将被扫描到类路径中名为 appContext.xml的每个资源,并且来自所有资源的 bean 定义将合并到一个单独的上下文中。

相反,classpath:conf/appContext.xml将从类路径获得一个且只有一个名为 appContext.xml的文件。如果不止一个,其他的就会被忽略。

简单的定义

classpath*:conf/appContext.xml只是意味着 所有 appContext.xml 文件conf文件夹下,在类路径上的所有罐子中都将被拾取并加入到一个大的应用程序上下文中。

相比之下,classpath:conf/appContext.xml将加载 只有一个这样的文件... 在您的类路径中找到的第一个。

Classspath * : 它引用类路径和 列表可以是空的中的 资源清单装满了这样的文件,如果类路径中的 没有这样的文件,那么应用程序 不会抛出任何异常(只是忽略错误)。

类路径: 它指的是在类路径和 如果类路径中没有这样的文件,它将抛出一个异常上找到的 某种资源只加载第一个文件

java.io.FileNotFoundException: class path resource [conf/appContext.xml] cannot be opened because it does not exist

Spring 的源代码:

public Resource[] getResources(String locationPattern) throws IOException {
Assert.notNull(locationPattern, "Location pattern must not be null");
//CLASSPATH_ALL_URL_PREFIX="classpath*:"
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).
int prefixEnd = locationPattern.indexOf(":") + 1;
if (getPathMatcher().isPattern(locationPattern.substring(prefixEnd))) {
// a file pattern
return findPathMatchingResources(locationPattern);
}
else {
// a single resource with the given name
return new Resource[] {getResourceLoader().getResource(locationPattern)};
}
}
}