【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 官方文档

相关推荐
lisw056 分钟前
计算与科学哲学(Philosophy of Computing and Science)
java·开发语言·人工智能
大白807 分钟前
你的数据库密码还在用明文?SQL Server 凭据管理的 3 种现代方案
后端
凤山老林7 分钟前
Spring Boot 集成 ShardingSphere-Encrypt 实现字段级实时脱敏
java·spring boot·后端·数据脱敏
vipxieliang7 分钟前
ValidX v1.2.0 更新日志
java·后端
Zane199415 分钟前
只改一个方向的引用,循环引用就能立刻被回收?一文讲透 weakref 弱引用
后端·python
长大198815 分钟前
窗口函数用不好反而更慢?SQL Server中OVER子句的4个性能陷阱
后端
大黄评测15 分钟前
MERGE语句有Bug?SQL Server官方不推荐的背后真相与替代方案
后端
长大198817 分钟前
TempDB 爆满导致系统卡死?SQL Server TempDB 瓶颈诊断与根治方案
后端
lichenyang45320 分钟前
从「房间」到「实时通知」:用 NestJS + Socket.IO 实现团队邀请的完整工程实践
前端·后端
大黄评测20 分钟前
为什么你的SQL查询慢?这7个执行计划陷阱90%的人都踩过
后端