【Spring | 应用上下文】

应用上下文

应用上下文和资源路径


本节介绍如何使用资源创建应用程序上下文,包括使用 XML 的快捷方式、如何使用通配符以及其他详细信息。

构造应用上下文


应用上下文构造函数(针对特定的应用上下文类型)通常将字符串或字符串数组作为资源的位置路径,例如构成上下文定义的 XML 文件。
示例如下

java 复制代码
ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/appContext.xml");
ApplicationContext ctx = new FileSystemXmlApplicationContext("conf/appContext.xml");
ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:conf/appContext.xml");
ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"}, MessengerService.class);

构造ClassPathXmlApplicationContext实例 --- 快捷方式


ClassPathXmlApplicationContext公开了许多构造函数以实现方便的实例化。基本思想是,您可以只提供一个字符串数组,该数组只包含XML文件本身的文件名(没有前导路径信息),还可以提供一个类。然后,ClassPathXmlApplicationContext从提供的类派生路径信息。

示例如下:

java 复制代码
com/
  example/
    services.xml
    repositories.xml
    MessengerService.class

使用通配符


ApplicationContext 构造器的中的资源路径可以是单一的路径(即一对一地映射到目标资源);也可以是通配符形式------可包含 classpath*:也可以是前缀或 ant 风格的正则表达式(使用 spring 的 PathMatcher 来匹配)。

这种机制的一个用途是当您需要进行组件样式的应用程序组装时。所有组件都可以将上下文定义片段发布到已知的位置路径,并且,当使用以classpath*:为前缀的相同路径创建最终应用程序上下文时,所有组件片段都会自动拾取。

这种通配符是特定于应用程序上下文构造函数中资源路径的使用(或者直接使用PathMatcher实用程序类层次结构时),并且在构建时进行解析。它与资源类型本身无关。不能使用classpath*:前缀来构造实际的Resource,因为一个资源一次只指向一个资源。

蚂蚁式图案


示例如下:

java 复制代码
/WEB-INF/*-context.xml
com/mycompany/**/applicationContext.xml
file:C:/some/path/*-context.xml
classpath:com/mycompany/**/applicationContext.xml

当路径位置包含Ant样式的模式时,解析器会遵循更复杂的过程来尝试解析通配符。它为最后一个非通配符段的路径生成一个Resource,并从中获取一个URL。

如果这个URL不是jar:URL或容器特定的变体(如WebLogic中的zip:、WebSphere中的wsjar等),则会从中获取java.io.File,并用于通过遍历文件系统来解析通配符。(在jar URL的情况下,解析器要么从中获取java.net.JarURLConnection,要么手动解析jar URL,然后遍历jar文件的内容以解析通配符)。

类路径:前缀


示例如下

java 复制代码
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:conf/appContext.xml");

使用 classpath* 表示类路径下所有匹配文件名称的资源都会被获取(本质上就是调用了 ClassLoader.getResources(...) 方法),接着将获取到的资源组装成最终的应用上下文。

在位置路径的其余部分,classpath*: 前缀可以与 PathMatcher 结合使用,如:classpath*:META-INF/*-beans.xml

带有类路径的Ant样式模式:如果要搜索的根包在多个类路径位置可用,则不能保证资源能够找到匹配的资源。
示例如下

java 复制代码
com/mycompany/package1/service-context.xml

classpath:com/mycompany/**/service-context.xml

这样的资源可能只存在于类路径中的一个位置,但当使用前面的示例这样的路径来尝试解析它时,解析程序会处理getResource("com/mycompany");返回的(第一个)URL;。如果此基本包节点存在于多个ClassLoader位置,则所需资源可能不存在于找到的第一个位置。因此,在这种情况下,您应该更喜欢使用classpath*:使用相同的Ant样式模式,该模式搜索包含com.mycompany基本包的所有classpath位置:classpath*∶com/mycompany/**/service-context.xml

复制代码
  如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏  🙌一起讨论
  你的支持就是我✍️创作的动力!					  💞💞💞

参考:
spring - Doc 官方文档

相关推荐
guozhetao几秒前
【ST表、倍增】P7167 [eJOI 2020] Fountain (Day1)
java·c++·python·算法·leetcode·深度优先·图论
技术思考者1 分钟前
基础很薄弱如何规划考研
java·经验分享·考研
●VON24 分钟前
重生之我在暑假学习微服务第二天《MybatisPlus-下篇》
java·学习·微服务·架构·mybatis-plus
老华带你飞24 分钟前
口腔助手|口腔挂号预约小程序|基于微信小程序的口腔门诊预约系统的设计与实现(源码+数据库+文档)
java·数据库·微信小程序·小程序·论文·毕设·口腔小程序
小鱼人爱编程29 分钟前
Java基石--反射让你直捣黄龙
前端·spring boot·后端
hqxstudying34 分钟前
J2EE模式---服务层模式
java·数据库·后端·spring·oracle·java-ee
GM_82840 分钟前
【最新最完整】SpringAI-1.0.0开发MCP Server,搭建MCP Client 实战笔记(进阶+详细+完整代码)
java·后端·ai编程·springai·mcp
都叫我大帅哥41 分钟前
Java DelayQueue:时间管理大师的终极武器
java
秋千码途1 小时前
小架构step系列27:Hibernate提供的validator
java·spring·架构·hibernate
都叫我大帅哥1 小时前
TOGAF迁移规划阶段全解密:从菜鸟到达人的通关秘籍
java