本章介绍 Spring 如何处理资源以及如何在 Spring 中使用资源。

Resource

Resource位于包中的Spring接口org.springframework.core.io.旨在成为一个更强大的接口,用于抽象对低级资源的访问。

虽然Resource接口在 Spring 和 Spring 中被大量使用,但在您自己的代码中将其本身用作通用实用程序类实际上非常方便,用于访问资源,即使您的代码不知道或不关心任何其他部分Spring 。虽然这会将您的代码与 Spring 耦合,但它实际上只是将它耦合到这一小部分实用程序类,它可以作为更强大的替代品,URL并且可以被认为等同于您将用于此目的的任何其他库。

内置Resource实现

UrlResource

UrlResource包装 ajava.net.URL并可用于访问通常可通过 URL 访问的任何对象,例如文件、HTTPS 目标、FTP 目标等。所有 URL 都有一个标准化的String表示,因此使用适当的标准化前缀来指示一个 URL 类型与另一个 URL 类型。这包括 file:访问文件系统路径、https:通过 HTTPS 协议ftp:访问资源、通过 FTP 访问资源等。

ClassPathResource

此类表示应从类路径获取的资源。它使用线程上下文类加载器、给定的类加载器或给定的类来加载资源。

FileSystemResource

这是文件的Resource实现。

ServletContextResource

这是解释相关 Web 应用程序根目录中的相对路径Resource的资源实现。

ResourceLoader

ResourceLoader接口旨在由可以返回(即加载)Resource实例的对象实现。

public interface ResourceLoader {

    Resource getResource(String location);

    ClassLoader getClassLoader();
}

所有应用程序上下文都实现了该ResourceLoader接口。因此,所有应用程序上下文都可以用于获取Resource实例。

例如,假设下面的代码片段是针对一个ClassPathXmlApplicationContext实例运行的:

Resource template = ctx.getResource("some/resource/path/myTemplate.txt");

您也可以ClassPathResource通过指定特殊前缀来强制使用,无论应用程序上下文类型如何classpath:

Resource template = ctx.getResource("classpath:some/resource/path/myTemplate.txt");

UrlResource同样,您可以通过指定任何标准 java.net.URL前缀来强制使用 a 。以下示例使用fileandhttps前缀:

Resource template = ctx.getResource("file:///some/resource/path/myTemplate.txt");
Resource template = ctx.getResource("https://myhost.com/resource/path/myTemplate.txt");

ResourcePatternResolver

ResourcePatternResolver接口是ResourceLoader接口的扩展,它ResourceLoader定义了将位置模式(例如,Ant 风格的路径模式)解析为Resource对象的策略。

classpath和classpath*区别: 

classpath:只会到你的class路径中查找找文件。

classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找。

注意: 用classpath*:需要遍历所有的classpath,所以加载速度是很慢的;因此,在规划的时候,应该尽可能规划好资源文件所在的路径,尽量避免使用classpath*。

classpath*的使用:

当项目中有多个classpath路径,并同时加载多个classpath路径下(此种情况多数不会遇到)的文件,*就发挥了作用,如果不加*,则表示仅仅加载第一个classpath路径。

如果要加载的资源,不在当前ClassLoader的路径里,那么用classpath:前缀是找不到的,这种情况下就需要使用classpath*:前缀。

在多个classpath中存在同名资源,都需要加载时,那么用classpath:只会加载第一个,这种情况下也需要用classpath*:前缀。

ResourceLoaderAware

提供了回调接口,用于提供希望获得ResourceLoader引用。

@Component
public class CustomResourceLoader implements ResourceLoaderAware {
@Autowired
private ResourceLoader resourceLoader; public void showResourceData()
{ Resource banner = resourceLoader.getResource("path");
......
} @Override
public void setResourceLoader(ResourceLoader resourceLoader) {
showResourceData()
}
}

资源作为依赖

如果 bean 本身要通过某种动态过程来确定和提供资源路径,那么 bean 使用ResourceLoaderor ResourcePatternResolver接口来加载资源可能是有意义的。如果资源是静态的,那么完全消除接口,让 bean 公开Resource它需要的属性,并期望它们被注入其中。

package example;

public class MyBean {

    private Resource template;

    public setTemplate(Resource template) {
this.template = template;
} // ...
}

在 XML 配置文件中,template可以使用该资源的简单字符串配置属性,如以下示例所示:

<bean id="myBean" class="example.MyBean">
<property name="template" value="some/resource/path/myTemplate.txt"/>
</bean>

如果MyBean该类被重构以用于注释驱动的配置

@Component
public class MyBean { private final Resource template; public MyBean(@Value("${template.path}") Resource template) {
this.template = template;
} // ...
}

如果我们想支持在类路径中多个位置的同一路径下发现的多个模板(例如,在类路径中的多个 jar 中),我们可以使用特殊classpath*:前缀和通配符将templates.path键定义为 classpath*:/config/templates/*.txt. 如果我们MyBean如下重新定义类,Spring 会将模板路径模式转换为Resource可以注入MyBean构造函数的对象数组。

@Component
public class MyBean { private final Resource[] templates; public MyBean(@Value("${templates.path}") Resource[] templates) {
this.templates = templates;
} // ...
}

应用程序上下文和资源路径

构建应用程序上下文

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

当这样的位置路径没有前缀时,Resource从该路径构建并用于加载 bean 定义的特定类型取决于并适用于特定的应用程序上下文。例如,考虑以下示例,该示例创建一个 ClassPathXmlApplicationContext

ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/appContext.xml");

bean 定义是从类路径加载的,因为ClassPathResource使用了 a。但是,请考虑以下示例,该示例创建一个FileSystemXmlApplicationContext

ApplicationContext ctx =
new FileSystemXmlApplicationContext("conf/appContext.xml");

应用程序上下文构造函数资源路径中的通配符

Ant 风格

路径位置可以包含 Ant 样式的模式,如以下示例所示:

/WEB-INF/*-context.xml
classpath*:前缀

在构建基于 XML 的应用程序上下文时,位置字符串可能会使用特殊classpath*:前缀

Spring系列之资源-11的更多相关文章

  1. Spring Boot 静态资源处理

    spring Boot 默认的处理方式就已经足够了,默认情况下Spring Boot 使用WebMvcAutoConfiguration中配置的各种属性. 建议使用Spring Boot 默认处理方式 ...

  2. Spring系列(零) Spring Framework 文档中文翻译

    Spring 框架文档(核心篇1和2) Version 5.1.3.RELEASE 最新的, 更新的笔记, 支持的版本和其他主题,独立的发布版本等, 是在Github Wiki 项目维护的. 总览 历 ...

  3. Spring 系列教程之容器的功能

    Spring 系列教程之容器的功能 经过前面几章的分析,相信大家已经对 Spring 中的容器功能有了简单的了解,在前面的章节中我们一直以 BeanFacotry 接口以及它的默认实现类 XmlBea ...

  4. Spring Boot 静态资源处理(转)

    Spring Boot 静态资源处理 Spring Boot 系列 Spring Boot 入门 Spring Boot 属性配置和使用 Spring Boot 集成MyBatis Spring Bo ...

  5. Spring系列(二):Spring IoC应用

    一.Spring IoC的核心概念 IoC(Inversion of Control  控制反转),详细的概念见Spring系列(一):Spring核心概念 二.Spring IoC的应用 1.定义B ...

  6. 朱晔和你聊Spring系列S1E11:小测Spring Cloud Kubernetes @ 阿里云K8S

    有关Spring Cloud Kubernates(以下简称SCK)详见https://github.com/spring-cloud/spring-cloud-kubernetes,在本文中我们主要 ...

  7. Spring系列(三):Spring IoC源码解析

    一.Spring容器类继承图 二.容器前期准备 IoC源码解析入口: /** * @desc: ioc原理解析 启动 * @author: toby * @date: 2019/7/22 22:20 ...

  8. Spring系列 SpringMVC的请求与数据响应

    Spring系列 SpringMVC的请求与数据响应 SpringMVC的数据响应 数据响应的方式 y以下案例均部署在Tomcat上,使用浏览器来访问一个简单的success.jsp页面来实现 Suc ...

  9. Spring系列14:IoC容器的扩展点

    Spring系列14:IoC容器的扩展点 回顾 知识需要成体系地学习,本系列文章前后有关联,建议按照顺序阅读.上一篇我们详细介绍了Spring Bean的生命周期和丰富的扩展点,没有阅读的强烈建议先阅 ...

  10. 通俗化理解Spring3 IoC的原理和主要组件(spring系列知识二总结)

    ♣什么是IoC? ♣通俗化理解IoC原理 ♣IoC好处 ♣工厂模式 ♣IoC的主要组件 ♣IoC的应用实例 ♣附:实例代码 1.什么是IoC(控制反转)? Spring3框架的核心是实现控制反转(Io ...

随机推荐

  1. postgresql源码解读

    大量模块源码解读 https://blog.csdn.net/cuichao1900?type=blog 存储管理(内存管理.外存管理)源码解读,每行都有注释 https://blog.csdn.ne ...

  2. 怎么才能卸载inventor?完全彻底卸载删除干净inventor各种残留注册表和文件的方法和步骤

    怎么才能卸载inventor?完全彻底卸载删除干净inventor各种残留注册表和文件的方法和步骤.如何卸载inventor呢?有很多同学想把inventor卸载后重新安装,但是发现inventor安 ...

  3. 微信小程序之配置业务域名踩过的坑

    1.在配置业务域名弹窗中保存按钮一直加载状态,无法保存则刷新当前界面后重新扫码打开该弹窗.2.检验文件一定要放在目标服务器域名下前端文件夹中,否则(放在后台代码文件夹中)访问不到地址.

  4. shell脚本,shell语法和结构(以Cshell/TC shell为例)

    1.C shell/TC shell常用语法和结构 (1) shbang行: #!/bin/sh,通知内核使用哪种内核解释脚本; #!/bin/csh 或 #!/bin/tcsh (2) 注释: 以# ...

  5. 解决ubuntu18环境matplotlib无法正常显示中文

    首先看看系统装了中文字体没?命令: fc-list :lang=zh 如果没安装,需要去下载或者从win复制一份到ubuntu, 在/usr/share/fonts文件夹下创建一个chinese文件夹 ...

  6. 【Selenium IDE】下载安装Chrome和Firefox插件IDE ide了解就行 不是重点 重点是写脚本

    下载安装Chrome和Firefox插件IDE 1.Chrome的IDE安装(1)由于chrome的限制所以提供了一个小方法:链接: https://www.crx4chrome.com/crx/77 ...

  7. 【PyCharm】PyCharm设置深色背景

    操作步骤 1.依次点击File->Settings->Appearance&Behavior->Appearance 2.选择Theme为Darcula

  8. python func_timeout 设置函数超时退出

    使用func_timeout设置函数超时退出,使用func_set_timeout装饰器和func_timeout方法 from func_timeout import func_set_timeou ...

  9. webpackHotMiddleware改造成koa支持的中间件

    const stream = require('stream'); const webpackHot = require('webpack-hot-middleware'); const PassTh ...

  10. python连接Oracel、postgreSQL、SQLserver、Mysql、mongodb、redis等常用数据库方法汇总

    python对接常用数据库 python有着极其丰富的第三方的库,如此强大的python语言操作各大数据库,不管你使用的关系型数据库是oracle,mysql, sqlserver,还是关系型数据库r ...