文書化 ここ 状態
この特別な接頭辞は、指定された名前に一致するすべてのクラスパスリソースを取得し(内部的には、これは本質的にClassLoader.getResources(...)呼び出しを介して行われます)、その後マージされて最終的なアプリケーションコンテキスト定義を形成する必要があることを指定します。
誰かがこれを説明できますか?
アスタリスクなしのclasspath*:conf/appContext.xml
とは対照的に、classpath:conf/appContext.xml
を使用することの違いは何ですか。
シンプルな定義
classpath*:conf/appContext.xml
は、単にすべてのappContext.xmlファイルクラスパス上のすべてのjar内のconf
フォルダーの下で選択され、1つの大きなアプリケーションコンテキストに結合されることを意味します。
対照的に、 classpath:conf/appContext.xml
がロードされますそのようなファイルは1つだけ ...クラスパスで最初に見つかったファイル。
classpath*:...
構文は、主にワイルドカード構文を使用して複数のBean定義ファイルからアプリケーションコンテキストを構築する場合に役立ちます。
たとえば、classpath*:appContext.xml
を使用してコンテキストを構築すると、クラスパス内のappContext.xml
というすべてのリソースのクラスパスがスキャンされ、それらすべてのBean定義が単一のコンテキストにマージされます。
対照的に、classpath:conf/appContext.xml
は、クラスパスからappContext.xml
という1つのファイルのみを取得します。複数ある場合、他は無視されます。
クラスパス*:これはリソースのリストおよびすべてをロードクラスパスに存在するそのようなファイルを参照し、リストは空でもかまいませんおよびクラスパスにそのようなファイルが存在しないの場合、アプリケーション例外をスローしない(エラーを無視するだけ)。
クラスパス:これは特定のリソースおよび最初のロードのみクラスパスで見つかったファイルを参照し、そのようなファイルが存在しない場合)クラスパスでは例外をスローします
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)};
}
}
}