目录
本章介绍 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*:
前缀
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!