概述
在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理URL资源、File资源资源、ClassPath相关资源、服务器相关资源(JBoss AS 5.x上的VFS资源)等等很多资源。因此处理这些资源需要使用不同的接口,这就增加了我们系统的复杂性;而且处理这些资源步骤都是类似的(打开资源、读取资源、关闭资源),因此如果能抽象出一个统一的接口来对这些底层资源进行统一访问,是不是很方便,而且使我们系统更加简洁,都是对不同的底层资源使用同一个接口进行访问。
Spring提供一个Resource接口来统一这些底层资源一致的访问,而且提供了一些便利的接口,从而能提供我们的生产力。
Resource接口
Spring的Resource接口代表底层外部资源,提供了对底层外部资源的一致性访问接口。
InputStreamSource接口解析:
● getInputStream:每次调用都将返回一个新鲜的资源对应的java.io.InputStream字节流,调用者在使用完毕后必须关闭该资源。
public interface InputStreamSource {
InputStream getInputStream() throws IOException;
}
Resource接口继承InputStreamSource接口,并提供一些便利方法:
● exists:返回当前Resource代表的底层资源是否存在
● isReadable:返回当前Resource代表的底层资源是否可读
● isOpen:返回当前Resource代表的底层资源是否已经打开,如果返回true,则只能被读取一次然后关闭以避免内存泄漏;常见的Resource实现一般返回false
● getURL:如果当前Resource代表的底层资源能由java.util.URL代表,则返回该URL,否则抛出IO异常
● getURI:如果当前Resource代表的底层资源能由java.util.URI代表,则返回该URI,否则抛出IO异常
● getFile:如果当前Resource代表的底层资源能由java.io.File代表,则返回该File,否则抛出IO异常
● contentLength:返回当前Resource代表的底层文件资源的长度,一般是值代表的文件资源的长度。
● lastModified:返回当前Resource代表的底层资源的最后修改时间。
● createRelative:用于创建相对于当前Resource代表的底层资源的资源,比如当前Resource代表文件资源“d:/test/”则createRelative(“test.txt”)将返回表文件资源“d:/test/test.txt”Resource资源。
● getFilename:返回当前Resource代表的底层文件资源的文件路径,比如File资源“file://d:/test.txt”将返回“d:/test.txt”,而URL资源http://www.javass.cn将返回“”,因为只返回文件路径。
● getDescription:返回当前Resource代表的底层资源的描述符,通常就是资源的全路径(实际文件名或实际URL地址)。
public interface Resource extends InputStreamSource {
boolean exists();
boolean isReadable();
boolean isOpen();
URL getURL() throws IOException;
URI getURI() throws IOException;
File getFile() throws IOException;
long contentLength() throws IOException;
long lastModified() throws IOException;
Resource createRelative(String relativePath) throws IOException;
String getFilename();
String getDescription();
}
Resource接口提供了足够的抽象,足够满足我们日常使用。而且提供了很多内置Resource实现:ByteArrayResource、InputStreamResource 、FileSystemResource 、UrlResource 、ClassPathResource、ServletContextResource、VfsResource等
ByteArrayResource可多次读取数组资源,即isOpen()永远返回false
public static void Test_ByteArrayResource() {
Resource resource = new ByteArrayResource("Hello!Spring!你好!".getBytes());
if (resource.exists()) {
dumpStream(resource);
}
}
private static void dumpStream(Resource resource) {
InputStream is = null;
try {
//1.获取文件资源
is = resource.getInputStream();
//2.读取资源
byte[] descBytes = new byte[is.available()];
is.read(descBytes);
System.out.println(new String(descBytes));
} catch (IOException e) {
e.printStackTrace();
}
finally {
try {
//3.关闭资源
is.close();
} catch (IOException e) {
}
}
}
InputStreamResource代表java.io.InputStream字节流,对于getInputStream操作将直接返回该字节流,因此只能读取一次该字节流,即isOpen永远返回true
public static void Test_InputStreamResource() {
ByteArrayInputStream bis = new ByteArrayInputStream(
"Hello Spring!".getBytes());
Resource resource = new InputStreamResource(bis);
if (resource.exists()) {
dumpStream(resource);
}
Assert.isTrue(resource.isOpen());
}
FileSystemResource代表java.io.File资源,对于getInputStream操作将返回底层文件的字节流,isOpen将永远返回false,从而表示可多次读取底层文件的字节流。
public static void Test_FileSystemResource() {
File file = new File("d:/test.txt");
Resource resource = new FileSystemResource(file);
if (resource.exists()) {
dumpStream(resource);
}
Assert.isTrue(!resource.isOpen());
}
ClassPathResource代表classpath路径的资源,将使用ClassLoader进行加载资源。classpath资源存在于类路径中的文件系统中或jar包里,且isOpen永远返回false,表示可多次读取资源。
ClassPathResource加载资源替代了Class类和ClassLoader类的getResource(String name)和getResourceAsStream(String name)两个加载类路径资源方法,提供一致的访问方式。
ClassPathResource提供了三个构造器:
● public ClassPathResource(String path):使用默认的ClassLoader加载“path”类路径资源;
● public ClassPathResource(String path, ClassLoader classLoader):使用指定的ClassLoader加载“path”类路径资源;
● public ClassPathResource(String path, Class<?> clazz):使用指定的类加载“path”类路径资源,将加载相对于当前类的路径的资源;
public static void Test_ClassPathResource() throws IOException {
Resource resource = new ClassPathResource("demo.properties");
if (resource.exists()) {
dumpStream(resource);
}
System.out.println("path:" + resource.getFile().getAbsolutePath());
Assert.isTrue(!resource.isOpen());
}
UrlResource代表URL资源,用于简化URL资源访问。isOpen永远返回false,表示可多次读取资源。
UrlResource一般支持如下资源访问:
● http:通过标准的http协议访问web资源,如new UrlResource(“http://地址”);
● ftp:通过ftp协议访问资源,如new UrlResource(“ftp://地址”);
● file:通过file协议访问本地文件系统资源,如new UrlResource(“file:d:/test.txt”)
ServletContextResource代表web应用资源,用于简化servlet容器的ServletContext接口的getResource操作和getResourceAsStream操作。
VfsResource代表Jboss 虚拟文件系统资源。
Jboss VFS(Virtual File System)框架是一个文件系统资源访问的抽象层,它能一致的访问物理文件系统、jar资源、zip资源、war资源等,VFS能把这些资源一致的映射到一个目录上,访问它们就像访问物理文件资源一样,而其实这些资源不存在于物理文件系统。
具体用法可以参考博客:http://jinnianshilongnian.iteye.com/blog/1416320
分享到:
相关推荐
Spring的Resource接口是访问资源的抽象,它提供了一种统一的资源访问方式,可以处理不同来源的资源,包括本地文件系统、类路径、URL等。Resource对象并不直接包含资源内容,而是提供了打开输入流、获取资源路径等...
- **Resource接口**:Spring提供了一个统一的Resource接口来访问不同类型的资源。 - **ResourceLoader接口**:提供了获取Resource的方法,通常由ApplicationContext实现。 #### 3.2 内置Resource实现 - **ClassPath...
例如,Resource接口提供了统一的方法来读取和写入资源,使得处理各种资源变得简单。 书中的内容可能还包括了Spring的其他关键特性,如数据访问集成(如JDBC、Hibernate、MyBatis的使用)、Spring Boot的快速开发...
- Spring提供了一套资源访问接口Resource,通过不同的实现类来支持各种类型的资源访问。 - **Resource实现类** - 包括网络资源、ClassPath资源、文件系统资源等多种类型。 - **资源加载** - 可以通过...
5. **文件系统访问**:Spring的`Resource`接口提供了读取、写入和复制文件的能力,例如`readInputStream()`方法可以获取到一个输入流,用于读取文件内容。 6. **classpath资源**:Spring允许在类路径中查找资源,这...
- **Resource 接口:** Resource 是 Spring 提供的一个接口,用于表示应用程序中的资源,如文件、URL 等。 - **内置的 Resource 应用:** Spring 内置了几种 Resource 实现,如 FileSystemResource、ClassPath...
- **Resource**是Spring中对外部资源的抽象,主要用于文件的抽象,尤其是XML文件,其中通常包含了Spring用户的Bean定义。 - **Resource**接口提供了一套比Java标准的URL访问机制更为灵活和强大的机制,支持多种资源...
### Spring3核心知识点详解 #### 一、Spring IoC与AOP **1.1 Spring IoC(Inversion of Control,控制反转)** - **概念理解**:IoC是一种设计原则,目的是为了降低代码之间的耦合度。在Spring框架中,IoC主要体现...
在资源管理方面,Spring提供了抽象的Resource接口,使得应用能够以统一的方式访问各种资源,如文件系统、类路径和网络资源等。ResourceLoader接口是用于获取Resource对象的工具,ResourceLoaderAware接口则是使Bean...
2.10 加载外部资源 82 2.10.1 问题 82 2.10.2 解决方案 83 2.10.3 工作原理 83 2.11 创建Bean后处理器 85 2.11.1 问题 85 2.11.2 解决方案 85 2.11.3 工作原理 86 2.12 外部化Bean配置 89 2.12.1...
3. **数据访问支持**:Spring提供了对JDBC、ORM(如Hibernate、MyBatis)和OXM(Object/Xml Mapping)的集成,简化了数据库操作。源码中,DataSource、JdbcTemplate、HibernateTemplate等类展示了Spring如何处理数据...
7. **资源管理**:Spring Core提供了对各种资源(如文件、URL、数据库连接等)的抽象和访问。`Resource`接口是资源的通用表示,`ResourceLoader`则用于加载资源。 8. **SpEL(Spring Expression Language)**:这是...
资源部分讲解了如何使用Spring框架加载资源文件,包括Resource接口的介绍、内置Resource实现类、ResourceLoader以及如何将资源作为依赖项。资源模块支持从不同来源加载资源文件,如文件系统、类路径、URL等。 验证...
2. **资源访问**:Spring提供了Resource接口和相应的实现类,可以方便地访问各种类型的资源,如文件系统、类路径下的资源等。 九、Spring的配置与扩展 1. **PropertyPlaceholderConfigurer**:用于在配置文件中解析...
- **ClassPathResource**:用于访问类路径下的资源,通常用于访问位于jar包或class目录下的资源。 ### Spring框架中的设计模式 #### 21. Spring框架中使用的设计模式 - **工厂模式**:通过BeanFactory或...
2.10 加载外部资源 82 2.10.1 问题 82 2.10.2 解决方案 83 2.10.3 工作原理 83 2.11 创建Bean后处理器 85 2.11.1 问题 85 2.11.2 解决方案 85 2.11.3 工作原理 86 2.12 外部化Bean配置 89 2.12.1...
12. **国际化的支持(i18n)**:Spring Boot 提供了处理多语言的工具,如消息源(MessageSource)和资源包(Resource Bundle)。 13. **事件驱动和消息传递**:通过 Spring Integration 和 AMQP 支持消息队列(如 ...