类 PathMatchingPatternResourceLoader
- 所有已实现的接口:
PatternResourceLoader,ResourceLoader
ResourceLoader implementation that is able to resolve a specified
resource location path into one or more matching Resources. The source path
may be a simple path which has a one-to-one mapping to a target
Resource, or alternatively may contain the special
"classpath*:" prefix and/or internal Ant-style regular expressions
(matched using AntPathMatcher utility). Both of the latter
are effectively wildcards.
No Wildcards:
In the simple case, if the specified location path does not start with the
"classpath*:" prefix, and does not contain a PathMatcher pattern,
this resolver will simply return a single resource via a
getResource() call on the underlying ResourceLoader. Examples
are real URLs such as "file:C:/context.xml", pseudo-URLs such as
"classpath:/context.xml", and simple unprefixed paths such as
"/WEB-INF/context.xml". The latter will resolve in a fashion specific
to the underlying ResourceLoader (e.g. ServletContextResource
for a WebApplicationContext).
Ant-style Patterns:
When the path location contains an Ant-style pattern, e.g.:
/WEB-INF/*-context.xml com/mycompany/**/applicationContext.xml file:C:/some/path/*-context.xml classpath:com/mycompany/**/applicationContext.xmlthe resolver follows a more complex but defined procedure to try to resolve the wildcard. It produces a
Resource for the path up to the last non-wildcard
segment and obtains a URL from it. If this URL is not a
"jar:" URL or container-specific variant (e.g. "zip:" in
WebLogic, "wsjar" in WebSphere", etc.), then a java.io.File
is obtained from it, and used to resolve the wildcard by walking the
filesystem. In the case of a jar URL, the resolver either gets a
java.net.JarURLConnection from it, or manually parses the jar URL,
and then traverses the contents of the jar file, to resolve the wildcards.
Implications on portability:
If the specified path is already a file URL (either explicitly, or implicitly
because the base ResourceLoader is a filesystem one, then wildcarding
is guaranteed to work in a completely portable fashion.
If the specified path is a classpath location, then the resolver must obtain
the last non-wildcard path segment URL via a
Classloader.getResource() call. Since this is just a node of the path
(not the file at the end) it is actually undefined (in the ClassLoader
Javadocs) exactly what sort of a URL is returned in this case. In practice,
it is usually a java.io.File representing the directory, where the
classpath resource resolves to a filesystem location, or a jar URL of some
sort, where the classpath resource resolves to a jar location. Still, there
is a portability concern on this operation.
If a jar URL is obtained for the last non-wildcard segment, the resolver must
be able to get a java.net.JarURLConnection from it, or manually parse
the jar URL, to be able to walk the contents of the jar, and resolve the
wildcard. This will work in most environments, but will fail in others, and
it is strongly recommended that the wildcard resolution of resources coming
from jars be thoroughly tested in your specific environment before you rely
on it.
classpath*: Prefix:
There is special support for retrieving multiple class path resources with
the same name, via the "classpath*:" prefix. For example,
"classpath*:META-INF/beans.xml" will find all "beans.xml" files in
the class path, be it in "classes" directories or in JAR files. This is
particularly useful for autodetecting config files of the same name at the
same location within each jar file. Internally, this happens via a
ClassLoader.getResources() call, and is completely portable.
The "classpath*:" prefix can also be combined with a PathMatcher pattern in
the rest of the location path, for example "classpath*:META-INF/*-beans.xml".
In this case, the resolution strategy is fairly simple: a
ClassLoader.getResources() call is used on the last non-wildcard path
segment to get all the matching resources in the class loader hierarchy, and
then off each resource the same PathMatcher resolution strategy described
above is used for the wildcard subpath.
Other notes:
As of 4.0, if getResources(String) is invoked with a location
pattern using the "classpath*:" prefix it will first search all modules
in the boot layer, excluding system modules. It will then search the classpath
using ClassLoader APIs as described previously and return the
combined results. Consequently, some of the limitations of classpath
searches may not apply when applications are deployed as modules.
WARNING: Note that "classpath*:" when combined with Ant-style
patterns will only work reliably with at least one root directory before the
pattern starts, unless the actual target files reside in the file system.
This means that a pattern like "classpath*:*.xml" will not
retrieve files from the root of jar files but rather only from the root of
expanded directories. This originates from a limitation in the JDK's
ClassLoader.getResources() method which only returns file system
locations for a passed-in empty String (indicating potential roots to
search). This ResourcePatternResolver implementation is trying to
mitigate the jar root lookup limitation through URLClassLoader
introspection and "java.class.path" manifest evaluation; however, without
portability guarantees.
WARNING: Ant-style patterns with "classpath:" resources are not guaranteed to find matching resources if the root package to search is available in multiple class path locations. This is because a resource such as
com/mycompany/package1/service-context.xml
may be in only one location, but when a path such as
classpath:com/mycompany/**/service-context.xml
is used to try to resolve it, the resolver will work off the (first)
URL returned by getResource("com/mycompany");. If this base package
node exists in multiple classloader locations, the actual end resource may
not be underneath. Therefore, preferably, use "classpath*:" with the
same Ant-style pattern in such a case, which will search all class
path locations that contain the root package.- 从以下版本开始:
- 2.1.7
- 作者:
- Juergen Hoeller, Colin Sampaleanu, Marius Bogoevici, Costin Leau, Phillip Webb, Sam Brannen, TODAY 2019-12-05 12:51
- 另请参阅:
-
字段概要
字段修饰符和类型字段说明private static final Predicate<ResolvedModule>private static final Loggerprivate PathMatcherprivate final ResourceLoaderSetof system module names.从接口继承的字段 cn.taketoday.core.io.PatternResourceLoader
CLASSPATH_ALL_URL_PREFIX从接口继承的字段 cn.taketoday.core.io.ResourceLoader
CLASSPATH_URL_PREFIX -
构造器概要
构造器构造器说明Create a new PathMatchingResourcePatternResolver with a DefaultResourceLoader.PathMatchingPatternResourceLoader(ResourceLoader resourceLoader) Create a new PathMatchingResourcePatternResolver.PathMatchingPatternResourceLoader(ClassLoader classLoader) Create a new PathMatchingResourcePatternResolver with a DefaultResourceLoader. -
方法概要
修饰符和类型方法说明private static voidacceptResource(ModuleReader moduleReader, String name, ResourceConsumer consumer) protected voidaddAllClassLoaderJarRoots(ClassLoader classLoader, ResourceConsumer consumer) Search allURLClassLoaderURLs for jar file references and add them to the given set of resources in the form of pointers to the root of the jar file content.protected voidaddClassPathManifestEntries(ResourceConsumer consumer) Determine jar file references from the "java.class.path." manifest property and add them to the given set of resources in the form of pointers to the root of the jar file content.protected ResourceconvertClassLoaderURL(URL url) Convert the given URL as returned from the ClassLoader into aResource.protected StringdetermineRootDir(String location) Determine the root directory for the given location.protected voiddoFindAllClassPathResources(String path, ResourceConsumer consumer) Find all class location resources with the given path via the ClassLoader.protected voiddoFindPathMatchingFileResources(Resource rootDirResource, String subPattern, ResourceConsumer consumer) Find all resources in the file system of the supplied root directory that match the given location sub pattern via the Ant-style PathMatcher.protected voiddoFindPathMatchingJarResources(Resource rootDirResource, URL rootDirURL, String subPattern, ResourceConsumer consumer) Find all resources in jar files that match the given location pattern via the Ant-style PathMatcher.protected voidfindAllClassPathResources(String location, ResourceConsumer consumer) Find all class location resources with the given location via the ClassLoader.protected voidfindAllModulePathResources(String locationPattern, ResourceConsumer consumer) Resolve the given location pattern intoResourceobjects for all matching resources found in the module path.protected voidfindPathMatchingResources(String locationPattern, ResourceConsumer consumer) Find all resources that match the given location pattern via the Ant-style PathMatcher.Expose theClassLoaderused by thisResourceLoader.protected JarFilegetJarFile(String jarFileUrl) Resolve the given jar file URL into a JarFile object.Return the PathMatcher that this resource pattern resolver uses.getResource(String location) Return a Resource handle for the specified resource location.getResources(String locationPattern) Resolve the given location pattern intoResourceobjects.protected booleanisJarResource(Resource resource) Return whether the given resource handle indicates a jar resource that thedoFindPathMatchingJarResources(cn.taketoday.core.io.Resource, java.net.URL, java.lang.String, cn.taketoday.core.io.ResourceConsumer)method can handle.protected voidrootDirResource(String subPattern, Resource rootDirResource, ResourceConsumer consumer) voidscan(String locationPattern, ResourceConsumer consumer) Scan the given location pattern intoResourceobjects.voidsetPathMatcher(PathMatcher pathMatcher) Set the PathMatcher implementation to use for this resource pattern resolver.private static StringstripLeadingSlash(String path) 从类继承的方法 java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait从接口继承的方法 cn.taketoday.core.io.PatternResourceLoader
getResourcesArray
-
字段详细资料
-
log
-
systemModuleNames
Setof system module names.- 从以下版本开始:
- 4.0
- 另请参阅:
-
isNotSystemModule
- 从以下版本开始:
- 4.0
- 另请参阅:
-
pathMatcher
-
resourceLoader
-
-
构造器详细资料
-
PathMatchingPatternResourceLoader
public PathMatchingPatternResourceLoader()Create a new PathMatchingResourcePatternResolver with a DefaultResourceLoader.ClassLoader access will happen via the thread context class loader.
- 另请参阅:
-
PathMatchingPatternResourceLoader
Create a new PathMatchingResourcePatternResolver.ClassLoader access will happen via the thread context class loader.
- 参数:
resourceLoader- the ResourceLoader to load root directories and actual resources with
-
PathMatchingPatternResourceLoader
Create a new PathMatchingResourcePatternResolver with a DefaultResourceLoader.- 参数:
classLoader- the ClassLoader to load classpath resources with, ornullfor using the thread context class loader at the time of actual resource access- 另请参阅:
-
-
方法详细资料
-
getClassLoader
从接口复制的说明:ResourceLoaderExpose theClassLoaderused by thisResourceLoader.Clients which need to access the
ClassLoaderdirectly can do so in a uniform manner with theResourceLoader, rather than relying on the thread contextClassLoader.- 指定者:
getClassLoader在接口中ResourceLoader- 返回:
- the
ClassLoader(onlynullif even the systemClassLoaderisn't accessible) - 另请参阅:
-
getRootLoader
- 从以下版本开始:
- 4.0
-
setPathMatcher
Set the PathMatcher implementation to use for this resource pattern resolver. Default is AntPathMatcher.- 另请参阅:
-
getPathMatcher
Return the PathMatcher that this resource pattern resolver uses. -
getResource
从接口复制的说明:ResourceLoaderReturn a Resource handle for the specified resource location.The handle should always be a reusable resource descriptor, allowing for multiple
InputStreamSource.getInputStream()calls.- Must support fully qualified URLs, e.g. "file:C:/test.dat".
- Must support classpath pseudo-URLs, e.g. "classpath:test.dat".
- Should support relative file paths, e.g. "WEB-INF/test.dat". (This will be implementation-specific, typically provided by an ApplicationContext implementation.)
Note that a Resource handle does not imply an existing resource; you need to invoke
Resource.exists()to check for existence.- 指定者:
getResource在接口中ResourceLoader- 参数:
location- the resource location- 返回:
- a corresponding Resource handle (never
null) - 另请参阅:
-
getResources
从接口复制的说明:PatternResourceLoaderResolve the given location pattern intoResourceobjects.Overlapping resource entries that point to the same physical resource should be avoided, as far as possible. The result should have set semantics.
- 指定者:
getResources在接口中PatternResourceLoader- 参数:
locationPattern- the location pattern to resolve- 返回:
- a mutable Set of the corresponding
Resourceinstances - 抛出:
IOException- in case of I/O errors
-
scan
从接口复制的说明:PatternResourceLoaderScan the given location pattern intoResourceobjects.Overlapping resource entries that point to the same physical resource should be avoided, as far as possible. The result should have set semantics.
- 指定者:
scan在接口中PatternResourceLoader- 参数:
locationPattern- the location pattern to resolve- 抛出:
IOException- in case of I/O errors
-
findAllClassPathResources
protected void findAllClassPathResources(String location, ResourceConsumer consumer) throws IOException Find all class location resources with the given location via the ClassLoader. Delegates todoFindAllClassPathResources(String, ResourceConsumer).- 参数:
location- the absolute path within the classpathconsumer- Resource consumer- 抛出:
IOException- in case of I/O errors- 另请参阅:
-
doFindAllClassPathResources
protected void doFindAllClassPathResources(String path, ResourceConsumer consumer) throws IOException Find all class location resources with the given path via the ClassLoader. Called byfindAllClassPathResources(String, ResourceConsumer).- 参数:
path- the absolute path within the classpath (never a leading slash)consumer- Resource consumer- 抛出:
IOException
-
convertClassLoaderURL
Convert the given URL as returned from the ClassLoader into aResource.The default implementation simply creates a
UrlResourceinstance.- 参数:
url- a URL as returned from the ClassLoader- 返回:
- the corresponding Resource object
- 另请参阅:
-
addAllClassLoaderJarRoots
protected void addAllClassLoaderJarRoots(@Nullable ClassLoader classLoader, ResourceConsumer consumer) Search allURLClassLoaderURLs for jar file references and add them to the given set of resources in the form of pointers to the root of the jar file content.- 参数:
classLoader- the ClassLoader to search (including its ancestors)consumer- Resource consumer
-
addClassPathManifestEntries
Determine jar file references from the "java.class.path." manifest property and add them to the given set of resources in the form of pointers to the root of the jar file content.- 参数:
consumer- Resource consumer
-
findPathMatchingResources
protected void findPathMatchingResources(String locationPattern, ResourceConsumer consumer) throws IOException Find all resources that match the given location pattern via the Ant-style PathMatcher. Supports resources in jar files and zip files and in the file system.- 参数:
locationPattern- the location pattern to match- 抛出:
IOException- in case of I/O errors- 另请参阅:
-
rootDirResource
protected void rootDirResource(String subPattern, Resource rootDirResource, ResourceConsumer consumer) throws IOException - 抛出:
IOException
-
determineRootDir
Determine the root directory for the given location.Used for determining the starting point for file matching, resolving the root directory location to be passed into
getResources(String), with the remainder of the location to be used as the sub pattern.Will return "/WEB-INF/" for the location "/WEB-INF/*.xml", for example.
- 参数:
location- the location to check- 返回:
- the part of the location that denotes the root directory
- 另请参阅:
-
isJarResource
Return whether the given resource handle indicates a jar resource that thedoFindPathMatchingJarResources(cn.taketoday.core.io.Resource, java.net.URL, java.lang.String, cn.taketoday.core.io.ResourceConsumer)method can handle.By default, the URL protocols "jar", "zip", "vfszip, and "wsjar" will be treated as jar resources. This template method allows for detecting further kinds of jar-like resources, e.g. through
instanceofchecks on the resource handle type.- 参数:
resource- the resource handle to check (usually the root directory to start path matching from)- 抛出:
IOException- 另请参阅:
-
doFindPathMatchingJarResources
protected void doFindPathMatchingJarResources(Resource rootDirResource, URL rootDirURL, String subPattern, ResourceConsumer consumer) throws IOException Find all resources in jar files that match the given location pattern via the Ant-style PathMatcher.- 参数:
rootDirResource- the root directory as ResourcerootDirURL- the pre-resolved root directory URLsubPattern- the sub pattern to match (below the root directory)- 抛出:
IOException- in case of I/O errors- 从以下版本开始:
- 4.0
- 另请参阅:
-
getJarFile
Resolve the given jar file URL into a JarFile object.- 抛出:
IOException
-
doFindPathMatchingFileResources
protected void doFindPathMatchingFileResources(Resource rootDirResource, String subPattern, ResourceConsumer consumer) throws IOException Find all resources in the file system of the supplied root directory that match the given location sub pattern via the Ant-style PathMatcher.- 参数:
rootDirResource- the root directory as a ResourcesubPattern- the sub pattern to match (below the root directory)consumer- Resource how to use- 抛出:
IOException- in case of I/O errors- 另请参阅:
-
findAllModulePathResources
protected void findAllModulePathResources(String locationPattern, ResourceConsumer consumer) throws IOException Resolve the given location pattern intoResourceobjects for all matching resources found in the module path.The location pattern may be an explicit resource path such as
"com/example/config.xml"or a pattern such as"com/example/**/config-*.xml"to be matched using the configuredPathMatcher.The default implementation scans all modules in the boot layer, excluding system modules.
- 参数:
locationPattern- the location pattern to resolveconsumer- consume the correspondingResource- 抛出:
IOException- in case of I/O errors- 从以下版本开始:
- 4.0
- 另请参阅:
-
acceptResource
private static void acceptResource(ModuleReader moduleReader, String name, ResourceConsumer consumer) throws IOException - 抛出:
IOException
-
stripLeadingSlash
-