クラス PathMatchingResourcePatternResolver

java.lang.ObjectSE
org.springframework.core.io.support.PathMatchingResourcePatternResolver
実装されたすべてのインターフェース:
ResourceLoaderResourcePatternResolver
既知の直属サブクラス
ServletContextResourcePatternResolver

public class PathMatchingResourcePatternResolver extends ObjectSE implements ResourcePatternResolver
指定されたリソースロケーションパスを 1 つ以上の一致するリソースに解決できる ResourcePatternResolver 実装。

ソースパスは、ターゲット Resource に 1 対 1 でマッピングされる単純なパスである場合もあれば、特別な "classpath*:" プレフィックスや内部 Ant スタイルパスパターン (Spring の AntPathMatcher ユーティリティを使用して照合される) を含む場合もあります。後者は両方とも事実上ワイルドカードです。

ワイルドカードなし

単純なケースでは、指定された場所のパスが "classpath*:" プレフィックスで始まらず、PathMatcher パターンが含まれていない場合、このリゾルバーは、基になる ResourceLoader の getResource() 呼び出しを介して単純に単一のリソースを返します。例としては、" などの実際の URL があります。file:C:/context.xml","classpath:/context.xml" などの疑似 URL、および "/WEB-INF/context.xml" などのプレフィックスのない単純なパス。後者は、基になる ResourceLoader (たとえば、WebApplicationContext の ServletContextResource ) に固有の方法で解決されます。

Ant スタイルのパターン

パスの場所に Ant スタイルのパターンが含まれる場合、例:

 /WEB-INF/*-context.xml
 com/example/**/applicationContext.xml
 file:C:/some/path/*-context.xml
 classpath:com/example/**/applicationContext.xml
リゾルバーは、ワイルドカードの解決を試みるために、より複雑ではあるが定義された手順に従います。最後の非ワイルドカードセグメントまでのパスの Resource を生成し、そこから URL を取得します。この URL が "jar:" URL またはコンテナー固有のバリアント (例: WebLogic の "zip:"、WebSphere の "wsjar" など) でない場合、URL に関連付けられたファイルシステムのルートディレクトリが取得され、使用されます。jar URL の場合、リゾルバーはそこから java.net.JarURLConnection を取得するか、手動で jar URL を解析してから、jar ファイルの内容をトラバースして、ワイルドカードを解決します。

移植性への影響

指定されたパスがすでにファイル URL である場合(明示的に、またはベース ResourceLoader がファイルシステムの 1 つであるために暗黙的に)、ワイルドカードは完全に移植可能な方法で機能することが保証されます。

指定されたパスがクラスパスの場所である場合、リゾルバーは、Classloader.getResource() 呼び出しを介して、最後の非ワイルドカードパスセグメント URL を取得する必要があります。これは (最後のファイルではなく) パスの単なるノードであるため、この場合にどのような種類の URL が返されるかは (ClassLoader Javadoc では) 実際には未定義です。実際には、通常、クラスパスリソースがファイルシステムの場所に解決されるディレクトリを表す java.io.File、またはクラスパスリソースが jar の場所に解決される何らかの jar URL です。ただし、この操作には移植性に関する懸念があります。

最後の非ワイルドカードセグメントに対して jar URL が取得された場合、リゾルバーはそこから java.net.JarURLConnection を取得できるか、jar URL を手動で解析して、jar の内容を調べてワイルドカードを解決できる必要があります。これはほとんどの環境で機能しますが、他の環境では失敗します。jar から取得したリソースのワイルドカード解決を信頼する前に、特定の環境で徹底的にテストすることを強くお勧めします。

classpath*: プレフィックス

"classpath*:" プレフィックスを介して、同じ名前を持つ複数のクラスパスリソースを取得するための特別なサポートがあります。例: "classpath*:META-INF/beans.xml" は、"classes" ディレクトリまたは JAR ファイルにある、クラスパス内のすべての "META-INF/beans.xml" ファイルを検索します。これは、各 jar ファイル内の同じ場所にある同じ名前の構成ファイルを自動検出する場合に特に便利です。内部的には、これは ClassLoader.getResources() 呼び出しを介して発生し、完全に移植可能です。

"classpath*:" プレフィックスは、ロケーションパスの残りの部分で PathMatcher パターンと組み合わせることもできます。たとえば、"classpath*:META-INF/*-beans.xml"" です。この場合、解決戦略はかなり単純です。最後の非ワイルドカードパスセグメントで ClassLoader.getResources() 呼び出しが使用され、クラスローダー階層内の一致するすべてのリソースが取得され、各リソースから同じ PathMatcher が取得されます。前述の解決戦略は、ワイルドカードサブパターンに使用されます。

その他の注意事項

Spring Framework 6.0 以降、getResources(String) が "classpath*:" プレフィックスを使用するロケーションパターンで呼び出される場合、システムモジュールを除く Boot 層内のすべてのモジュールが最初に検索されます。次に、前述のように ClassLoaderSE API を使用してクラスパスを検索し、結合された結果を返します。クラスパス検索の制限の一部は、アプリケーションがモジュールとしてデプロイされている場合には適用されない場合があります。

警告 : Ant スタイルのパターンと組み合わせた "classpath*:" は、実際のターゲットファイルがファイルシステム内に存在しない限り、パターンが開始される前に少なくとも 1 つのルートディレクトリでのみ確実に動作することに注意してください。これは、"classpath*:*.xml" のようなパターンは、jar ファイルのルートからではなく、展開されたディレクトリのルートからのみファイルを取得することを意味します。これは、渡された空の文字列 (検索する潜在的なルートを示す) のファイルシステムの場所のみを返す JDK の ClassLoader.getResources() メソッドの制限に起因します。この ResourcePatternResolver 実装は、URLClassLoaderSE イントロスペクションと "java.class.path" マニフェスト評価を通じて jar ルートルックアップの制限を軽減しようとします。ただし、移植性は保証されません。

警告 : "classpath:" リソースを含む Ant スタイルのパターンでは、検索対象の基本パッケージが複数のクラスパスの場所で利用可能な場合、一致するリソースが見つかるとは限りません。これは、次のようなリソースがあるためです。

   com/example/package1/service-context.xml
クラスパスの場所は 1 つだけ存在する可能性がありますが、次のような場所のパターンが存在する場合
   classpath:com/example/**/service-context.xml
を使用して解決しようとすると、リゾルバーは getResource("com/example") によって返された (最初の) URL に基づいて機能します。com/example 基本パッケージノードが複数のクラスパスの場所に存在する場合、実際に必要なリソースが最初の URL の com/example 基本パッケージに存在しない可能性があります。このような場合は、基本パッケージを含むすべてのクラスパスの場所を検索する同じ Ant スタイルパターンで "classpath*:" を使用することをお勧めします。
導入:
1.0.2
作成者:
Juergen Hoeller, Colin Sampaleanu, Marius Bogoevici, Costin Leau, Phillip Webb, Sam Brannen, Sebastien Deleuze, Dave Syer
関連事項:
  • コンストラクターの詳細

    • PathMatchingResourcePatternResolver

      public PathMatchingResourcePatternResolver()
      DefaultResourceLoader で PathMatchingResourcePatternResolver を作成します。

      ClassLoader アクセスは、スレッドコンテキストクラスローダーを介して行われます。

      関連事項:
    • PathMatchingResourcePatternResolver

      public PathMatchingResourcePatternResolver(ResourceLoader resourceLoader)
      提供された ResourceLoader を使用して PathMatchingResourcePatternResolver を作成します。

      ClassLoader アクセスは、スレッドコンテキストクラスローダーを介して行われます。

      パラメーター:
      resourceLoader - ResourceLoader を使用してルートディレクトリと実際のリソースをロードします
    • PathMatchingResourcePatternResolver

      public PathMatchingResourcePatternResolver(@Nullable ClassLoaderSE classLoader)
      DefaultResourceLoader および提供された ClassLoaderSE を使用して PathMatchingResourcePatternResolver を作成します。
      パラメーター:
      classLoader - クラスパスリソースをロードする ClassLoader、または実際のリソースアクセス時にスレッドコンテキストクラスローダーを使用するための null 
      関連事項:
  • メソッドの詳細

    • getResourceLoader

      public ResourceLoader getResourceLoader()
      このパターンリゾルバーが動作する ResourceLoader を返します。
    • getClassLoader

      @Nullable public ClassLoaderSE getClassLoader()
      インターフェースからコピーされた説明: ResourceLoader
      この ResourceLoader で使用される ClassLoaderSE を公開します。

      ClassLoader に直接アクセスする必要があるクライアントは、スレッドコンテキスト ClassLoader に依存するのではなく、ResourceLoader を使用して均一な方法でアクセスできます。

      次で指定:
      インターフェース ResourceLoadergetClassLoader 
      戻り値:
      ClassLoader (システム ClassLoader にさえアクセスできない場合は、null のみ)
      関連事項:
    • setPathMatcher

      public void setPathMatcher(PathMatcher pathMatcher)
      このリソースパターンリゾルバーに使用する PathMatcher 実装を設定します。

      デフォルトは AntPathMatcher です。

      関連事項:
    • getPathMatcher

      public PathMatcher getPathMatcher()
      このリソースパターンリゾルバーが使用する PathMatcher を返します。
    • getResource

      public Resource getResource(StringSE location)
      インターフェースからコピーされた説明: ResourceLoader
      指定されたリソースの場所の Resource ハンドルを返します。

      ハンドルは常に再利用可能なリソース記述子であり、複数の InputStreamSource.getInputStream() 呼び出しを許可する必要があります。

      • 完全修飾 URL をサポートする必要があります。" ファイル: C:/test.dat"。
      • クラスパスの擬似 URL をサポートする必要があります。"classpath:test.dat"。
      • 相対ファイルパスをサポートする必要があります(例: "WEB-INF/test.dat"。(これは実装固有であり、通常は ApplicationContext 実装によって提供されます。)

      Resource ハンドルは、既存のリソースを意味するものではないことに注意してください。存在を確認するには、Resource.exists() を呼び出す必要があります。

      次で指定:
      インターフェース ResourceLoadergetResource 
      パラメーター:
      location - リソースの場所
      戻り値:
      対応する Resource ハンドル (非 null)
      関連事項:
    • getResources

      public Resource[] getResources(StringSE locationPattern) throws IOExceptionSE
      インターフェースからコピーされた説明: ResourcePatternResolver
      指定されたロケーションパターンを Resource オブジェクトに解決します。

      同じ物理リソースを指すリソースエントリの重複は、できる限り避ける必要があります。結果にはセマンティクスが設定されている必要があります。

      次で指定:
      インターフェース ResourcePatternResolvergetResources 
      パラメーター:
      locationPattern - 解決する位置パターン
      戻り値:
      対応する Resource オブジェクト
      例外:
      IOExceptionSE - I/O エラーの場合
    • findAllClassPathResources

      protected Resource[] findAllClassPathResources(StringSE location) throws IOExceptionSE
      ClassLoader を介して、指定された場所のすべてのクラスの場所リソースを検索します。

      doFindAllClassPathResources(String) へのデリゲート。

      パラメーター:
      location - クラスパス内の絶対パス
      戻り値:
      リソース配列としての結果
      例外:
      IOExceptionSE - I/O エラーの場合
      関連事項:
    • doFindAllClassPathResources

      protected SetSE<Resource> doFindAllClassPathResources(StringSE path) throws IOExceptionSE
      構成された ClassLoader を介して、指定されたパスを持つすべてのクラスパスリソースを検索します。

      findAllClassPathResources(String) によって呼び出されます。

      パラメーター:
      path - クラスパス内の絶対パス (先行スラッシュは決してありません)
      戻り値:
      一致する Resource インスタンスの可変セット
      例外:
      IOExceptionSE
      導入:
      4.1.1
    • convertClassLoaderURL

      protected Resource convertClassLoaderURL(URLSE url)
      構成された ClassLoader から返された指定された URL を Resource に変換し、パターンなしのパス検索に適用します ( findAllClassPathResources(java.lang.String) を参照)。

      6.0.5 の時点で、デフォルト実装は、「ファイル」プロトコルの場合は FileSystemResource を作成し、それ以外の場合は UrlResource を作成し、同じリソースレイアウト内のパターンベースのクラスパストラバーサルの結果と一致し、モジュールパス検索の結果と一致します。

      パラメーター:
      url - 構成された ClassLoader から返された URL
      戻り値:
      対応する Resource オブジェクト
      関連事項:
    • addAllClassLoaderJarRoots

      protected void addAllClassLoaderJarRoots(@Nullable ClassLoaderSE classLoader, SetSE<Resource> result)
      すべての URLClassLoaderSE URL で jar ファイル参照を検索し、jar ファイルコンテンツのルートへのポインターの形式で、指定されたリソースのセットにそれぞれを追加します。
      パラメーター:
      classLoader - 検索する ClassLoader (その祖先を含む)
      result - jar ルートを追加するリソースのセット
      導入:
      4.1.1
    • addClassPathManifestEntries

      protected void addClassPathManifestEntries(SetSE<Resource> result)
      Class-Path マニフェストエントリ (システムクラスローダーによって java.class.path JVM システムプロパティに追加される) から jar ファイル参照を特定し、それぞれを jar ファイルコンテンツのルートへのポインタの形式で指定されたリソースのセットに追加します。
      パラメーター:
      result - jar ルートを追加するリソースのセット
      導入:
      4.3
    • findPathMatchingResources

      protected Resource[] findPathMatchingResources(StringSE locationPattern) throws IOExceptionSE
      Ant スタイルの PathMatcher を介して、指定された場所のパターンに一致するすべてのリソースを検索します。

      OSGi バンドル、JBoss VFS、jar ファイル、zip ファイル、ファイルシステムのリソースをサポートします。

      パラメーター:
      locationPattern - 一致する場所のパターン
      戻り値:
      リソース配列としての結果
      例外:
      IOExceptionSE - I/O エラーの場合
      関連事項:
    • determineRootDir

      protected StringSE determineRootDir(StringSE location)
      指定された場所のルートディレクトリを決定します。

      ファイルマッチングの開始点を決定するために使用され、ルートディレクトリの場所を解決して getResources(String) に渡し、その場所の残りの部分をサブパターンとして使用します。

      たとえば、ロケーション "/WEB-INF/*.xml" に対して "/WEB-INF/" を返します。

      パラメーター:
      location - チェックする場所
      戻り値:
      ルートディレクトリを示す場所の部分
      関連事項:
    • resolveRootDirResource

      protected Resource resolveRootDirResource(Resource original) throws IOExceptionSE
      指定されたルートディレクトリリソースを解決してパスを照合します。

      デフォルトでは、findPathMatchingResources(String) は、Equinox OSGi の "bundleresource:" および "bundleentry:" URL を、Spring の標準 jar ファイルトラバーサルアルゴリズムを使用してトラバースされる標準 jar ファイル URL に解決します。

      カスタム解決の場合は、このテンプレートメソッドをオーバーライドし、提供されたリソースハンドルをそれに応じて置き換えます。

      このメソッドのデフォルト実装は、提供されたリソースを変更せずに返します。

      パラメーター:
      original - 解決するリソース
      戻り値:
      解決されたリソース (提供されたリソースと同一である可能性があります)
      例外:
      IOExceptionSE - 解決に失敗した場合
      関連事項:
    • isJarResource

      protected boolean isJarResource(Resource resource) throws IOExceptionSE
      指定されたリソースハンドルが、doFindPathMatchingJarResources(org.springframework.core.io.Resource, java.net.URL, java.lang.String) メソッドが処理できる jar リソースを示しているかどうかを確認します。

      findPathMatchingResources(String)ResourceUtils.isJarURL(URL) に委譲して、指定された URL が jar ファイル内のリソースを指しているかどうかを判断し、このメソッドをフォールバックとしてのみ呼び出します。

      このテンプレートメソッドを使用すると、さらに種類の jar のようなリソースを検出できるようになります。たとえば、instanceof を介してリソースハンドル型をチェックします。

      このメソッドのデフォルト実装は false を返します。

      パラメーター:
      resource - チェックするリソースハンドル (通常、パスのマッチングを開始するルートディレクトリ)
      戻り値:
      true (指定されたリソースハンドルが jar リソースを示している場合)
      例外:
      IOExceptionSE - I/O エラーの場合
      関連事項:
    • doFindPathMatchingJarResources

      protected SetSE<Resource> doFindPathMatchingJarResources(Resource rootDirResource, URLSE rootDirUrl, StringSE subPattern) throws IOExceptionSE
      Ant スタイルの PathMatcher を介して、指定された場所のパターンに一致する jar ファイル内のすべてのリソースを検索します。
      パラメーター:
      rootDirResource - リソースとしてのルートディレクトリ
      rootDirUrl - 事前に解決されたルートディレクトリの URL
      subPattern - 一致するサブパターン (ルートディレクトリの下)
      戻り値:
      一致する Resource インスタンスの可変セット
      例外:
      IOExceptionSE - I/O エラーの場合
      導入:
      4.3
      関連事項:
    • getJarFile

      protected JarFileSE getJarFile(StringSE jarFileUrl) throws IOExceptionSE
      指定された jar ファイルの URL を JarFile オブジェクトに解決します。
      例外:
      IOExceptionSE
    • doFindPathMatchingFileResources

      protected SetSE<Resource> doFindPathMatchingFileResources(Resource rootDirResource, StringSE subPattern) throws IOExceptionSE
      Ant スタイルの PathMatcher を介して、指定されたルートディレクトリのファイルシステム内で、指定された場所のサブパターンに一致するすべてのリソースを検索します。
      パラメーター:
      rootDirResource - リソースとしてのルートディレクトリ
      subPattern - 一致するサブパターン (ルートディレクトリの下)
      戻り値:
      一致する Resource インスタンスの可変セット
      例外:
      IOExceptionSE - I/O エラーの場合
      関連事項:
    • findAllModulePathResources

      protected SetSE<Resource> findAllModulePathResources(StringSE locationPattern) throws IOExceptionSE
      モジュールパスで見つかったすべての一致するリソースについて、指定された場所のパターンを Resource オブジェクトに解決します。

      位置パターンは、"com/example/config.xml" などの明示的なリソースパス、または構成された PathMatcher を使用して照合される "com/example/**/config-*.xml" などのパターンである場合があります。

      デフォルトの実装では、システムモジュールを除く、Boot 層のすべてのモジュールがスキャンされます。

      パラメーター:
      locationPattern - 解決する位置パターン
      戻り値:
      対応する Resource オブジェクトを含む変更可能な Set 
      例外:
      IOExceptionSE - I/O エラーの場合
      導入:
      6.0
      関連事項: