💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
应用上下文构造器方法的资源路径可以是简单的路径(如上所示),其具有到目标资源的一对一映射,或者可以包含特殊的`classpath *`:前缀和/或内部Ant- 样式正则表达式(使用Spring的PathMatcher实用程序进行匹配)。 后两者都是有效的通配符. 此机制的一个用途是在执行组件式应用程序组装时。 所有组件都可以将上下文定义片段“发布”到众所周知的位置路径,并且当最终应用程序上下文使用通过`classpath *`:前缀的相同路径创建时,所有组件片段将自动被选取。 请注意,此通配符特定于在应用程序上下文构造方法的资源路径(或直接使用`PathMatcher`工具类),并在构建时解析。 它与`Resource `类型本身无关。 无法使用统配`classpath *`:前缀来构造实际的`Resource`,因为`Resource`一次只能指向一个资源。 ## Ant-style Patterns 当路径位置包含Ant样式时,例如: ~~~ /WEB-INF/*-context.xml com/mycompany/**/applicationContext.xml file:C:/some/path/*-context.xml classpath:com/mycompany/**/applicationContext.xml ~~~ 处理统配路径过程非常复杂但遵循一定规则,首先把通配符之前的路径生产一个资源,从中获取URL.如果URL不是`jar:`,或容器的特点变量,(如weblogic的`zip`或websphare的`wsjar`),则从中获取`java.io.File`,并通过遍历文件系统来解析通配符。在`jar` URL的情况下,解析器要么从中获取`java.net.JarURLConnection`,要么手动解析`jar` URL,然后遍历jar文件的内容来解析通配符。 ## Implications on portability 如果指定的路径已经是文件URL(无论是显式还是隐式,因为基本`ResourceLoader`是文件系统的一种),那么通配符将保证以完全便携的方式工作。 如果指定的路径是类路径位置,则解析器必须通过`Classloader.getResource()`调用获取最后一个非通配符路径段URL。 因为这只是路径的一个节点(不是最后的文件),所以它实际上是未定义的(在`ClassLoader` javadoc中),在这种情况下,究竟返回了什么样的URL。 实际上,它总是一个表示目录的`java.io.File`,类路径资源解析为文件系统位置,或者某种类型的jar URL,其中classpath资源解析为jar位置。 但是,这个操作仍然存在可移植性问题。 如果为最后一个非通配符段获取了一个jar URL,解析器必须能够从中获取一个`java.net.JarURLConnection`,或者手动解析该jar URL,以便能够遍历该jar的内容,并解析 通配符。 这可以在大多数环境中使用,但在其他环境中会失败,强烈建议您在依赖特定环境之前彻底测试来自jars的资源的通配符解决方案。 ## he classpath*: prefix 在构建基于XML的应用程序上下文时,位置字符串可能会使用特殊的类路径*:前缀: ~~~ ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:conf/appContext.xml"); ~~~ 此特殊前缀指定必须获取与给定名称匹配的所有类路径资源(内部实质上这是通过`ClassLoader.getResources(...)`调用发生的),然后进行合并以形成最终的应用程序上下文定义。 通配符类路径依赖于底层类加载器的`getResources()`方法。 由于现在大多数应用程序服务器都提供它们自己的类加载器实现,所以在处理jar文件时行为可能会有所不同。 检查`classpath *`是否工作的简单测试是使用classloader从classpath中的jar中加载文件:`getClass().getClassLoader().getResources(“<someFileInsideTheJar>”)`。 使用具有相同名称但位于两个不同位置的文件进行此测试。 如果返回的结果不正确,请检查应用程序服务器文档以了解可能影响类加载器行为的设置。 `classpath *`:前缀也可以与其他位置路径中的`PathMatcher`模式组合使用,例如`classpath *:META-INF / * - beans.xml`。 在这种情况下,解决策略非常简单:在最后一个非通配符路径段上使用`ClassLoader.getResources()`调用来获取类加载器层次结构中的所有匹配资源,然后再如上所述遍历资源文件. ## Other notes relating to wildcards 请注意,除非实际目标文件驻留在文件系统中,否则`classpath *`:与Ant样式模式结合使用时,必须在模式启动之前至少有一个根目录可靠地运行。 这意味着`classpath*:*.xml`这样的模式可能不会从jar文件的根文件中检索文件,而只能从扩展目录的根文件中检索文件。 Spring检索类路径条目的能力来源于JDK的`ClassLoader.getResources()`方法,该方法传入空字符串时返回文件系统位置(指示要搜索的潜在根)。 Spring会评估`URLClassLoader`运行时配置和jar文件中的“`java.class.path”`清单,但这并不保证会导致可移植行为。 使用`classpath:`的Ant样式模式:如果类路径中多个根包,则无法保证找到匹配的资源。 这是因为资源如下 ~~~ com/mycompany/package1/service-context.xml ~~~ 可能只在一个位置,但是当一条路径如 ~~~ classpath:com/mycompany/**/service-context.xml ~~~ 尝试处理,首先`getResource("com/mycompany")`如果此包节点存在于多个类加载程序位置中,但选中的一个可能实际的最终资源可能不在其下。因此使用`classpath*:`搜选所有的根包,才能保证找到资源.