public class PathMatchingResourcePatternResolver extends ObjectSE implements ResourcePatternResolver
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/mycompany/**/applicationContext.xml file:C:/some/path/*-context.xml classpath:com/mycompany/**/applicationContext.xmlリゾルバーは、より複雑ですが定義された手順に従って、ワイルドカードを解決しようとします。最後の非ワイルドカードセグメントまでのパスの
Resource
を生成し、そこから URL
を取得します。この URL が "jar:
" URL またはコンテナー固有のバリアント(例: WebLogic の "zip:
"、WebSphere の "wsjar
" など)でない場合、java.io.File
がそこから取得され、ワイルドカードをウォーキングして解決する jar URL の場合、リゾルバーは java.net.JarURLConnection
を取得するか、jar URL を手動で解析してから、jar ファイルのコンテンツを走査して、ワイルドカードを解決します。移植性への影響:
指定されたパスがすでにファイル URL である場合(ベース ResourceLoader
がファイルシステムのパスであるため、明示的または暗黙的に)、ワイルドカードは完全に移植可能な方法で機能することが保証されています。
指定されたパスがクラスパスの場所である場合、リゾルバーは Classloader.getResource()
呼び出しを介して最後の非ワイルドカードパスセグメント URL を取得する必要があります。これは単なるパスのノード(最後のファイルではない)であるため、実際には(ClassLoader Javadocs で)未定義であり、この場合、どのような種類の URL が返されるかは明確ではありません。実際には、これは通常、クラスパスリソースがファイルシステムの場所に解決されるディレクトリを表す java.io.File
、またはクラスパスリソースが jar の場所に解決される何らかの jar URL です。それでも、この操作には移植性の問題があります。
jar URL が最後の非ワイルドカードセグメントに対して取得された場合、リゾルバーは java.net.JarURLConnection
を取得するか、jar URL を手動で解析して、jar のコンテンツを調べ、ワイルドカードを解決できる必要があります。これはほとんどの環境で機能しますが、他の環境では失敗します。jar からのリソースのワイルドカード解決は、依存する前に特定の環境で徹底的にテストすることを強くお勧めします。
classpath*:
プレフィックス:
"classpath*:
" プレフィックスを介して、同じ名前の複数のクラスパスリソースを取得するための特別なサポートがあります。例: "classpath*:META-INF/beans.xml
" は、"classes" ディレクトリまたは JAR ファイルのいずれであっても、クラスパス内のすべての "beans.xml" ファイルを検索します。これは、各 jar ファイル内の同じ場所にある同じ名前の構成ファイルを自動検出する場合に特に便利です。内部的には、これは ClassLoader.getResources()
呼び出しを介して行われ、完全に移植可能です。
"classpath *:" プレフィックスは、ロケーションパスの残りの部分で PathMatcher パターンと組み合わせることもできます(例: "classpath *:META-INF/*-beans.xml")。この場合、解決戦略はかなり単純です。最後の非ワイルドカードパスセグメントで ClassLoader.getResources()
呼び出しを使用して、クラスローダー階層内の一致するすべてのリソースを取得し、各リソースから上記の同じ PathMatcher 解決戦略を使用します。ワイルドカードサブパス。
その他の注意事項:
警告 : "classpath*:
" を Ant スタイルのパターンと組み合わせると、実際のターゲットファイルがファイルシステムに存在しない限り、パターンが開始する前に少なくとも 1 つのルートディレクトリでのみ確実に機能することに注意してください。"classpath*:*.xml
" のようなパターンが jar ファイルのルートからファイルを取得するだけではなく、むしろ拡大したディレクトリのルートからではないだろうというこの手段。これは、渡された空の文字列(検索する潜在的なルートを示す)のファイルシステムの場所のみを返す JDK の ClassLoader.getResources()
メソッドの制限に起因します。この ResourcePatternResolver
実装は、URLClassLoader
SE イントロスペクションと "java.class.path" マニフェスト評価を通じて jar ルートルックアップの制限を緩和しようとしています。ただし、移植性の保証はありません。
警告 : 検索するルートパッケージが複数のクラスパスの場所で利用可能な場合、"classpath:" リソースを含む Ant スタイルのパターンは、一致するリソースを見つけることが保証されていません。これ
com/mycompany/package1/service-context.xml1 つの場所にのみ存在する場合があります
classpath:com/mycompany/**/service-context.xmlを使用して解決しようとすると、リゾルバーは
getResource("com/mycompany");
によって返された(最初の)URL を処理します。この基本パッケージノードが複数のクラスローダーの場所に存在する場合、実際の最終リソースはそにない可能性があります。そのような場合は、同じ Ant スタイルのパターンで "classpath*:
" を使用することをお勧めします。これにより、ルートパッケージを含むすべてのクラスパスの場所が検索されます。ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
, AntPathMatcher
, ResourceLoader.getResource(String)
, ClassLoader.getResources(String)
SECLASSPATH_ALL_URL_PREFIX
CLASSPATH_URL_PREFIX
コンストラクターと説明 |
---|
PathMatchingResourcePatternResolver() DefaultResourceLoader を使用して新しい PathMatchingResourcePatternResolver を作成します。 |
PathMatchingResourcePatternResolver(ClassLoaderSE classLoader) DefaultResourceLoader を使用して新しい PathMatchingResourcePatternResolver を作成します。 |
PathMatchingResourcePatternResolver(ResourceLoader resourceLoader) 新しい PathMatchingResourcePatternResolver を作成します。 |
修飾子と型 | メソッドと説明 |
---|---|
protected void | addAllClassLoaderJarRoots(ClassLoaderSE classLoader, SetSE<Resource> result) jar ファイル参照のすべての URLClassLoader SE URL を検索し、jar ファイルコンテンツのルートへのポインターの形で、指定されたリソースのセットに追加します。 |
protected void | addClassPathManifestEntries(SetSE<Resource> result) "java.class.path." マニフェストプロパティから jar ファイル参照を決定し、jar ファイルコンテンツのルートへのポインターの形式で指定されたリソースのセットに追加します。 |
protected Resource | convertClassLoaderURL(URLSE url) ClassLoader から返された指定の URL を Resource に変換します。 |
protected StringSE | determineRootDir(StringSE location) 指定された場所のルートディレクトリを決定します。 |
protected SetSE<Resource> | doFindAllClassPathResources(StringSE path) ClassLoader を介して、指定されたパスを持つすべてのクラスロケーションリソースを検索します。 |
protected SetSE<Resource> | doFindMatchingFileSystemResources(FileSE rootDir, StringSE subPattern) Ant スタイルの PathMatcher を介して、指定されたロケーションパターンに一致するファイルシステム内のすべてのリソースを検索します。 |
protected SetSE<Resource> | doFindPathMatchingFileResources(Resource rootDirResource, StringSE subPattern) Ant スタイルの PathMatcher を介して、指定されたロケーションパターンに一致するファイルシステム内のすべてのリソースを検索します。 |
protected SetSE<Resource> | doFindPathMatchingJarResources(Resource rootDirResource, URLSE rootDirURL, StringSE subPattern) Ant スタイルの PathMatcher を介して、指定されたロケーションパターンに一致する jar ファイル内のすべてのリソースを検索します。 |
protected void | doRetrieveMatchingFiles(StringSE fullPattern, FileSE dir, SetSE<FileSE> result) 指定されたパターンに一致するファイルを再帰的に取得し、指定された結果リストに追加します。 |
protected Resource[] | findAllClassPathResources(StringSE location) ClassLoader を介して、指定された場所のすべてのクラスの場所リソースを検索します。 |
protected Resource[] | findPathMatchingResources(StringSE locationPattern) Ant スタイルの PathMatcher を使用して、指定されたロケーションパターンに一致するすべてのリソースを検索します。 |
ClassLoaderSE | getClassLoader() この ResourceLoader で使用される ClassLoader SE を公開します。 |
protected JarFileSE | getJarFile(StringSE jarFileUrl) 指定された jar ファイルの URL を JarFile オブジェクトに解決します。 |
PathMatcher | getPathMatcher() このリソースパターンリゾルバーが使用する PathMatcher を返します。 |
Resource | getResource(StringSE location) 指定されたリソースの場所の Resource ハンドルを返します。 |
ResourceLoader | getResourceLoader() このパターンリゾルバーが動作する ResourceLoader を返します。 |
Resource[] | getResources(StringSE locationPattern) 指定されたロケーションパターンを Resource オブジェクトに解決します。 |
protected boolean | isJarResource(Resource resource) 指定されたリソースハンドルが doFindPathMatchingJarResources メソッドが処理できる jar リソースを示すかどうかを返します。 |
protected FileSE[] | listDirectory(FileSE dir) 指定されたディレクトリ内のファイルのソートされたリストを決定します。 |
protected Resource | resolveRootDirResource(Resource original) パス一致のために指定されたリソースを解決します。 |
protected SetSE<FileSE> | retrieveMatchingFiles(FileSE rootDir, StringSE pattern) 指定されたパスパターンに一致するファイルを取得し、指定されたディレクトリとそのサブディレクトリを確認します。 |
void | setPathMatcher(PathMatcher pathMatcher) このリソースパターンリゾルバーに使用する PathMatcher 実装を設定します。 |
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
public PathMatchingResourcePatternResolver()
ClassLoader アクセスは、スレッドコンテキストクラスローダーを介して行われます。
public PathMatchingResourcePatternResolver(ResourceLoader resourceLoader)
ClassLoader アクセスは、スレッドコンテキストクラスローダーを介して行われます。
resourceLoader
- ルートディレクトリと実際のリソースを読み込む ResourceLoaderpublic PathMatchingResourcePatternResolver(@Nullable ClassLoaderSE classLoader)
classLoader
- クラスパスリソースをロードする ClassLoader、または実際のリソースアクセス時にスレッドコンテキストクラスローダーを使用するための null
DefaultResourceLoader
public ResourceLoader getResourceLoader()
@Nullable public ClassLoaderSE getClassLoader()
ResourceLoader
ResourceLoader
で使用される ClassLoader
SE を公開します。ClassLoader
に直接アクセスする必要があるクライアントは、スレッドコンテキスト ClassLoader
に依存するのではなく、ResourceLoader
を使用して均一な方法でアクセスできます。
ResourceLoader
の getClassLoader
ClassLoader
(システム ClassLoader
にさえアクセスできない場合は、null
のみ)ClassUtils.getDefaultClassLoader()
, ClassUtils.forName(String, ClassLoader)
public void setPathMatcher(PathMatcher pathMatcher)
AntPathMatcher
public PathMatcher getPathMatcher()
public Resource getResource(StringSE location)
ResourceLoader
Resource
ハンドルを返します。 ハンドルは常に再利用可能なリソース記述子であり、複数の InputStreamSource.getInputStream()
呼び出しを許可する必要があります。
Resource
ハンドルは、既存のリソースを意味するものではないことに注意してください。存在を確認するには、Resource.exists()
を呼び出す必要があります。
ResourceLoader
の getResource
location
- リソースの場所 Resource
ハンドル (非 null
)ResourceLoader.CLASSPATH_URL_PREFIX
, Resource.exists()
, InputStreamSource.getInputStream()
public Resource[] getResources(StringSE locationPattern) throws IOExceptionSE
ResourcePatternResolver
Resource
オブジェクトに解決します。同じ物理リソースを指すリソースエントリの重複は、できる限り避ける必要があります。結果にはセマンティクスが設定されている必要があります。
ResourcePatternResolver
の getResources
locationPattern
- 解決する位置パターン Resource
オブジェクト IOExceptionSE
- I/O エラーの場合 protected Resource[] findAllClassPathResources(StringSE location) throws IOExceptionSE
doFindAllClassPathResources(String)
へのデリゲート。location
- クラスパス内の絶対パス IOExceptionSE
- I/O エラーの場合 ClassLoader.getResources(java.lang.String)
SE, convertClassLoaderURL(java.net.URL)
protected SetSE<Resource> doFindAllClassPathResources(StringSE path) throws IOExceptionSE
findAllClassPathResources(String)
によって呼び出されます。path
- クラスパス内の絶対パス (先行スラッシュは決してありません)IOExceptionSE
protected Resource convertClassLoaderURL(URLSE url)
Resource
に変換します。 デフォルトの実装では、単に UrlResource
インスタンスを作成します。
url
- ClassLoader から返された URLClassLoader.getResources(java.lang.String)
SE, Resource
protected void addAllClassLoaderJarRoots(@Nullable ClassLoaderSE classLoader, SetSE<Resource> result)
URLClassLoader
SE URL を検索し、jar ファイルコンテンツのルートへのポインターの形で、指定されたリソースのセットに追加します。classLoader
- 検索する ClassLoader (その祖先を含む)result
- jar ルートを追加するリソースのセット protected void addClassPathManifestEntries(SetSE<Resource> result)
result
- jar ルートを追加するリソースのセット protected Resource[] findPathMatchingResources(StringSE locationPattern) throws IOExceptionSE
locationPattern
- 一致する場所のパターン IOExceptionSE
- I/O エラーの場合 doFindPathMatchingJarResources(org.springframework.core.io.Resource, java.net.URL, java.lang.String)
, doFindPathMatchingFileResources(org.springframework.core.io.Resource, java.lang.String)
, PathMatcher
protected StringSE determineRootDir(StringSE location)
ファイルマッチングの開始点を決定し、ルートディレクトリの場所を java.io.File
に解決し、残りの場所をパターンとして retrieveMatchingFiles
に渡します。
たとえば、パターン "/WEB-INF/*.xml" に対して "/WEB-INF/" を返します。
location
- チェックする場所 retrieveMatchingFiles(java.io.File, java.lang.String)
protected Resource resolveRootDirResource(Resource original) throws IOExceptionSE
デフォルトでは、Equinox OSGi "bundleresource:"/"bundleentry:" URL は、Spring の標準 jar ファイルトラバーサルアルゴリズムを使用してトラバースされる標準 jar ファイル URL に解決されます。上記のカスタム解決については、このメソッドをオーバーライドし、それに応じてリソースハンドルを置き換えます。
original
- 解決するリソース IOExceptionSE
- 解決に失敗した場合 protected boolean isJarResource(Resource resource) throws IOExceptionSE
doFindPathMatchingJarResources
メソッドが処理できる jar リソースを示すかどうかを返します。 デフォルトでは、URL プロトコル "jar"、"zip"、"vfszip"、"wsjar" は jar リソースとして扱われます。このテンプレートメソッドを使用すると、リソースハンドル型の instanceof
チェックなど、jar のようなリソースをさらに検出できます。
resource
- チェックするリソースハンドル (通常、パスのマッチングを開始するルートディレクトリ)IOExceptionSE
doFindPathMatchingJarResources(org.springframework.core.io.Resource, java.net.URL, java.lang.String)
, ResourceUtils.isJarURL(java.net.URL)
protected SetSE<Resource> doFindPathMatchingJarResources(Resource rootDirResource, URLSE rootDirURL, StringSE subPattern) throws IOExceptionSE
rootDirResource
- リソースとしてのルートディレクトリ rootDirURL
- 事前に解決されたルートディレクトリの URLsubPattern
- 一致するサブパターン (ルートディレクトリの下)IOExceptionSE
- I/O エラーの場合 JarURLConnection
SE, PathMatcher
protected JarFileSE getJarFile(StringSE jarFileUrl) throws IOExceptionSE
protected SetSE<Resource> doFindPathMatchingFileResources(Resource rootDirResource, StringSE subPattern) throws IOExceptionSE
rootDirResource
- リソースとしてのルートディレクトリ subPattern
- 一致するサブパターン (ルートディレクトリの下)IOExceptionSE
- I/O エラーの場合 retrieveMatchingFiles(java.io.File, java.lang.String)
, PathMatcher
protected SetSE<Resource> doFindMatchingFileSystemResources(FileSE rootDir, StringSE subPattern) throws IOExceptionSE
rootDir
- ファイルシステムのルートディレクトリ subPattern
- 一致するサブパターン (ルートディレクトリの下)IOExceptionSE
- I/O エラーの場合 retrieveMatchingFiles(java.io.File, java.lang.String)
, PathMatcher
protected SetSE<FileSE> retrieveMatchingFiles(FileSE rootDir, StringSE pattern) throws IOExceptionSE
rootDir
- 開始するディレクトリ pattern
- ルートディレクトリを基準にして照合するパターン IOExceptionSE
- ディレクトリの内容を取得できなかった場合 protected void doRetrieveMatchingFiles(StringSE fullPattern, FileSE dir, SetSE<FileSE> result) throws IOExceptionSE
fullPattern
- 照合するパターン、先頭にルートディレクトリパスを追加 dir
- 現在のディレクトリ result
- 追加する一致する File インスタンスのセット IOExceptionSE
- ディレクトリの内容を取得できなかった場合 protected FileSE[] listDirectory(FileSE dir)
dir
- イントロスペクトするディレクトリ File.listFiles()
SE