web-dev-qa-db-ja.com

Springクラスパスのプレフィックスの違い

文書化 ここ 状態

この特別な接頭辞は、指定された名前に一致するすべてのクラスパスリソースを取得し(内部的には、これは本質的にClassLoader.getResources(...)呼び出しを介して行われます)、その後マージされて最終的なアプリケーションコンテキスト定義を形成する必要があることを指定します。

誰かがこれを説明できますか?

アスタリスクなしのclasspath*:conf/appContext.xmlとは対照的に、classpath:conf/appContext.xmlを使用することの違いは何ですか。

135
JavaRocky

シンプルな定義

classpath*:conf/appContext.xmlは、単にすべてのappContext.xmlファイルクラスパス上のすべてのjar内のconfフォルダーの下で選択され、1つの大きなアプリケーションコンテキストに結合されることを意味します。

対照的に、 classpath:conf/appContext.xmlがロードされますそのようなファイルは1つだけ ...クラスパスで最初に見つかったファイル。

198
Eugene Ryzhikov

classpath*:...構文は、主にワイルドカード構文を使用して複数のBean定義ファイルからアプリケーションコンテキストを構築する場合に役立ちます。

たとえば、classpath*:appContext.xmlを使用してコンテキストを構築すると、クラスパス内のappContext.xmlというすべてのリソースのクラスパスがスキャンされ、それらすべてのBean定義が単一のコンテキストにマージされます。

対照的に、classpath:conf/appContext.xmlは、クラスパスからappContext.xmlという1つのファイルのみを取得します。複数ある場合、他は無視されます。

38
skaffman

クラスパス*:これはリソースのリストおよびすべてをロードクラスパスに存在するそのようなファイルを参照し、リストは空でもかまいませんおよびクラスパスにそのようなファイルが存在しないの場合、アプリケーション例外をスローしない(エラーを無視するだけ)。

クラスパス:これは特定のリソースおよび最初のロードのみクラスパスで見つかったファイルを参照し、そのようなファイルが存在しない場合)クラスパスでは例外をスローします

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

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)};
      }
   }
}  
0
zzz