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


141

文書化され、ここでそれは状態

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

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

アスタリスクclasspath*:conf/appContext.xmlclasspath:conf/appContext.xmlない場合と使用する場合の違いは何ですか。


今後の読者もこのバグを "status = declined"で参照してください。 github.com/spring-projects/spring-framework/issues/16017 URLが最終的に失敗した場合に備えて、バグポストのタイトルは「ワイルドカードクラスパスとワイルドカードパスを持つJARファイルのルートからのXMLファイルのインポート」です。が機能しない[SPR-11390] "
granadaCoder

回答:


207

シンプルな定義

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

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


6
それらの間にはもう1つの興味深い違いがあります。また、私の質問を参照してください:stackoverflow.com/questions/16985770/...
ユージン

27
1つの非常に重要なこと-*を使用していて、Springが一致しない場合、文句は表示されません。*を使用せず、一致するものがない場合、コンテキストは起動しません(!)
Roy Truelove

39

classpath*:...ワイルドカード構文を使用して、複数のBean定義ファイルからのアプリケーションコンテキストを構築したいとき、構文は、主に便利です。

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

対照的に、classpath:conf/appContext.xmlappContext.xmlクラスパスから呼び出された唯一のファイルを取得します。複数ある場合、他は無視されます。


2
クラスパス*もサブディレクトリにありますか?つまり、クラスパスのルートにappContext.xmlがあり、/ dir / appContext.xmlに1つある場合、classpath *:appContext.xmlを使用すると両方が読み込まれますか?
AHungerArtist 2015

21

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

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

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

公式ドキュメントResourceリソースが一度に1つのリソースのみを指すため、実際のを構築するためにclasspath *:プレフィックスを使用することはできません。」さらに、この奇妙なエラーが発生しました。それが、私がここまで行った方法です。リソースをインポートする場合は、ワイルドカードクラスパスプレフィックスを使用しても意味がありません。
GabrielOshiro 2018

0

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

説明していただけますか?
RtmY
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.