Spring系列之资源-11
目录
本章介绍 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 。以下示例使用file
andhttps
前缀:
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 使用ResourceLoader
or 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的更多相关文章
- Spring Boot 静态资源处理
spring Boot 默认的处理方式就已经足够了,默认情况下Spring Boot 使用WebMvcAutoConfiguration中配置的各种属性. 建议使用Spring Boot 默认处理方式 ...
- Spring系列(零) Spring Framework 文档中文翻译
Spring 框架文档(核心篇1和2) Version 5.1.3.RELEASE 最新的, 更新的笔记, 支持的版本和其他主题,独立的发布版本等, 是在Github Wiki 项目维护的. 总览 历 ...
- Spring 系列教程之容器的功能
Spring 系列教程之容器的功能 经过前面几章的分析,相信大家已经对 Spring 中的容器功能有了简单的了解,在前面的章节中我们一直以 BeanFacotry 接口以及它的默认实现类 XmlBea ...
- Spring Boot 静态资源处理(转)
Spring Boot 静态资源处理 Spring Boot 系列 Spring Boot 入门 Spring Boot 属性配置和使用 Spring Boot 集成MyBatis Spring Bo ...
- Spring系列(二):Spring IoC应用
一.Spring IoC的核心概念 IoC(Inversion of Control 控制反转),详细的概念见Spring系列(一):Spring核心概念 二.Spring IoC的应用 1.定义B ...
- 朱晔和你聊Spring系列S1E11:小测Spring Cloud Kubernetes @ 阿里云K8S
有关Spring Cloud Kubernates(以下简称SCK)详见https://github.com/spring-cloud/spring-cloud-kubernetes,在本文中我们主要 ...
- Spring系列(三):Spring IoC源码解析
一.Spring容器类继承图 二.容器前期准备 IoC源码解析入口: /** * @desc: ioc原理解析 启动 * @author: toby * @date: 2019/7/22 22:20 ...
- Spring系列 SpringMVC的请求与数据响应
Spring系列 SpringMVC的请求与数据响应 SpringMVC的数据响应 数据响应的方式 y以下案例均部署在Tomcat上,使用浏览器来访问一个简单的success.jsp页面来实现 Suc ...
- Spring系列14:IoC容器的扩展点
Spring系列14:IoC容器的扩展点 回顾 知识需要成体系地学习,本系列文章前后有关联,建议按照顺序阅读.上一篇我们详细介绍了Spring Bean的生命周期和丰富的扩展点,没有阅读的强烈建议先阅 ...
- 通俗化理解Spring3 IoC的原理和主要组件(spring系列知识二总结)
♣什么是IoC? ♣通俗化理解IoC原理 ♣IoC好处 ♣工厂模式 ♣IoC的主要组件 ♣IoC的应用实例 ♣附:实例代码 1.什么是IoC(控制反转)? Spring3框架的核心是实现控制反转(Io ...
随机推荐
- 虚拟内存跟物理内存之间的映射mmap\munmap
#include <stdio.h> #include <sys/mman.h> int main(void) { /* * 创建虚拟内存的映射 * void *mmap (v ...
- C#中延迟初始化实现原理的一点浅见。
定义 延迟初始化:一个对象的延迟初始化意味着它的创建被推迟到它第一次使用.(对于本主题,延迟初始化和延迟实例化是同义词.)延迟初始化主要用于提高性能.避免浪费计算和减少程序内存需求. 用法及简单介绍 ...
- Gitblit的windows安装(java编写)
准备工作: 1.jdk(大于等于1.8版本)2.GitBlit压缩包:jdk下载地址:https://www.java.com/zh-CN/Gitblit下载地址:http://www.gitblit ...
- Linux下clang、gcc、intel编译器最新版本安装笔记
转自 http://t.zoukankan.com/opangle-p-2838554.html
- 2023 01 19 HW
2023 01 19 HW Okay, then let's start. Okay. Maybe Karina, we start with the C2 design freeze. Yeah, ...
- SpringMVC文件上传详解
声明 源码基于Spring Boot 2.3.12.RELEASE.Spring Framework 5.2.15.RELEASE Servlet3.0 文件上传 Servlet 3.0对于HttpS ...
- Flink 消费RabbitMQ 和 Kafka
在消息RabbitMQ时,我们关心的一个问题是手动ack还是自动ack,如果是自动ack就怕出现丢消息的情况 Flink以RabbitMQ作为Source,是怎么保证消息唯一性的呢,是怎么保证ack的 ...
- Redis后端面试题
目录 简要说一下什么是Redis? 为什么要⽤Redis(缓存)? 为什么要⽤Redis⽽不⽤map/guava做缓存? Redis与Memcached的区别 Redis的应⽤场景 redis为什么那 ...
- CUDA Arch 代码
- go标准库之fmt
go标准库之fmt fmt库 Print系列 1. Print 不换行 2. Println 换行 3. Printf 不换行,可以使用格式化占位符 格式化占位符 占位符 说明 通用 --- %v 值 ...