应用上下文构造器方法的资源路径可以是简单的路径(如上所示),其具有到目标资源的一对一映射,或者可以包含特殊的`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*:`搜选所有的根包,才能保证找到资源.
- 正确打开本书的姿势
- 第一部分 Core
- 1. Ioc container
- 1.1. Introduction to the Spring IoC container and beans
- 1.2. Container overview
- 1.2.1. Configuration metadata
- 1.2.2. Instantiating a container
- 1.2.3. Using the container
- 1.3. Bean overview
- 1.3.1. Naming beans
- 1.3.2. Instantiating beans
- 1.4. Dependencies
- 1.4.1. Dependency Injection
- 1.4.2. Dependencies and configuration in detail
- 1.4.3. Using depends-on
- 1.4.4. Lazy-initialized beans
- 1.4.5. Autowiring collaborators
- 1.4.6. Method injection
- 1.5 Bean Scopes
- 1.6. Customizing the nature of a bean TODO
- 1.7. Bean definition inheritance TODO
- 1.8. Container Extension Points TODO
- 1.9. Annotation-based container configuration
- 1.9.1. @Required
- 1.9.2. @Autowired
- 1.9.3. Fine-tuning annotation-based autowiring with @Primary
- 1.9.4. Fine-tuning annotation-based autowiring with qualifiers TODO
- 1.9.5. Using generics as autowiring qualifiers TODO
- 1.9.6. CustomAutowireConfigurer TODO
- 1.10. Classpath scanning and managed components
- 1.10.1. @Component and further stereotype annotations
- 1.11. Using JSR 330 Standard Annotations TODO
- 1.12. Java-based container configuration
- 1.12.1. Basic concepts: @Bean and @Configuration
- 1.12.2. Instantiating the Spring container using AnnotationConfigApplicationContext
- 2. Resources
- 2.1. Introduction
- 2.2. The Resource interface
- 2.3. Built-in Resource implementations
- 2.3.1. UrlResource
- 2.3.2. ClassPathResource
- 2.3.3. FileSystemResource
- 2.3.4. ServletContextResource
- 2.3.5. InputStreamResource
- 2.3.6. ByteArrayResource
- 2.4. The ResourceLoader
- 2.5. The ResourceLoaderAware interface
- 2.6. Resources as dependencies
- 2.7. Application contexts and Resource paths
- 2.7.1. Constructing application contexts
- 2.7.2. Wildcards in application context constructor resource paths
- 2.7.3. FileSystemResource caveats
- 3. Validation, Data Binding, and Type Conversion
- 4. Spring Expression Language (SpEL)
- 5. Aspect Oriented Programming with Spring
- 5.1. Introduction
- 5.1.1. AOP concepts
- 5.1.2. Spring AOP capabilities and goals
- 5.1.3. AOP Proxies
- 5.2. @AspectJ support
- 5.2.1. Enabling @AspectJ Support
- 5.2.2. Declaring an aspect
- 5.2.3. Declaring a pointcut
- 5.2.4. Declaring advice
- 5.2.5. Introductions TODO
- 5.2.6. Aspect instantiation models TODO
- 5.2.7. Example
- 5.3. Schema-based AOP support TODO
- 5.4. Choosing which AOP declaration style to use TODO
- 5.5. Mixing aspect types TODO
- 5.6. Proxying mechanisms
- 5.6.1. Understanding AOP proxies
- 5.7. Programmatic creation of @AspectJ Proxies
- 5.8. Using AspectJ with Spring applications
- 5.8.1. Using AspectJ to dependency inject domain objects with Spring
- 5.8.2. Other Spring aspects for AspectJ
- 第二部分 Testing
- 第三部分 Data Access
- 1. Transaction Management
- 1.1. Introduction to Spring Framework transaction management
- 1.2 Advantages of the Spring Framework’s transaction support model
- 1.2.1. Global transactions
- 1.2.2. Local transactions
- 1.2.3. Spring Framework’s consistent programming model
- 1.3. Understanding the Spring Framework transaction abstraction
- 1.4. Synchronizing resources with transactions
- 1.4.1. High-level synchronization approach
- 1.4.2. Low-level synchronization approach
- 1.4.3. TransactionAwareDataSourceProxy
- 1.5. Declarative transaction management
- 1.5.1. Understanding the Spring Framework’s declarative transaction implementation
- 1.5.2. Example of declarative transaction implementation
- 1.5.3. Rolling back a declarative transaction
- 1.5.4. Configuring different transactional semantics for different beans
- 1.5.5. tx:advice元素的 settings
- 1.5.6. Using @Transactional
- 1.5.7. Transaction propagation
- 1.5.8. Advising transactional operations
- 1.5.9. Using @Transactional with AspectJ TODO
- 第四部分 web servlet
- 第五部分 Web Reactive
- 第六部分 Integration
- 第七部分 Languages