在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理URL资源、File资源资源、ClassPath相关资源、服务器相关资源(JBoss AS 5.x上的VFS资源)等等很多资源。因此处理这些资源需要使用不同的接口,这就增加了我们系统的复杂性;而且处理这些资源步骤都是类似的(打开资源、读取资源、关闭资源),因此如果能抽象出一个统一的接口来对这些底层资源进行统一访问,是不是很方便,而且使我们系统更加简洁,都是对不同的底层资源使用同一个接口进行访问。

Spring 提供一个Resource接口来统一这些底层资源一致的访问,而且提供了一些便利的接口,从而能提供我们的生产力。

类继承图

类定义

InputStreamSource

public interface InputStreamSource {InputStream getInputStream() throws IOException;
}

getInputStream:定位并打开资源,返回资源对应的输入流。每次调用都会返回新的输入流,调用者在使用完毕后必须关闭该资源。

Resource

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();
}

UrlResource

代表URL资源,用于简化URL资源访问,是对java.net.URL的包装。在java中,将不同来源的资源抽象成URL,通过注册不同的handler来处理不同来源的资源的读取逻辑。一般不同类型使用不同的前缀。

isOpen永远返回false,表示可多次读取资源。

UrlResource应该提供标准的协议前缀,一般支持如下资源访问:

  • http:通过标准的http协议访问web资源,如new UrlResource(“http://地址”);
  • ftp:通过ftp协议访问资源,如new UrlResource(“ftp://地址”);
  • file:通过file协议访问本地文件系统资源,如new UrlResource(“file:d:/test.txt”)

但是UrlResource无法解决相对classpath路径或servletContext的处理方法,因此需要其他的Resource实现类。

ClassPathResource

代表classpath路径的资源,将使用ClassLoader进行加载资源。主要优势是方便访问类加载路径下的资源,尤其是Web应用,因为它可以自动搜索位于WEB-INF/classes下的资源文件

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”类路径资源,将加载相对于当前类的路径的资源;

当Spring获取资源时,路径字符串前缀是"classpath:",则系统将会自动创建ClassPathResource对象

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());
}

当Spring获取资源时,路径字符串前缀是"file:",则系统将会自动创建FileSystemResource对象

ServletContextResource

访问Web Context下相对路径下的资源,入参的资源位置是相对于Web应用根路径的位置(工程文件夹下,WEB-INF所在的那级文件夹)。用于简化servlet容器的ServletContext接口的getResource操作和getResourceAsStream操作。

使用ServletContextResource无需关心资源是否被解压缩出来,或者直接存放在JAR文件中,都可以通过Servlet容器访问。

入参需要ServletContext和字符串类型

    public class ResourceTest {ServletContextResource resource = new ServletContextResource(servletContext,"spring.xml");}

InputStreamResource

代表java.io.InputStream字节流,对于getInputStream操作将直接返回该字节流,因此只能读取一次该字节流,即isOpen永远返回true(其他Resource大都为false可以多次读取)

只有当没有合适的Resource实现时,才考虑使用InputStreamResource。一般考虑使用ByteArrayResource

ByteArrayResource

可多次读取数组资源,即isOpen()永远返回false

ByteArrayResource因为入参可以是byte[]类型,所以用途比较广泛,可以把从网络或者本地资源都转换为byte[]类型,然后用ByteArrayResource转化为资源。

Spring--Resource相关推荐

  1. Spring.Resource与Spring资源获取方式

    讲到资源,就得提下Spring获取资源方式,常用的有两种 通过Resource接口的子类获取资源通过ResourceLoader接口的子类获取资源 Spring.Resource 资源操作函数一览 / ...

  2. Spring Resource接口获取资源

    1.1.1. Resource简介 在Spring内部实现机制,针对于资源文件(配置的xml文件)有一个统一的接口Resource. 1.1.1.1. 接口定义的方法 1.exists():判断资源文 ...

  3. java resouce_深入了解 Java Resource Spring Resource

    在Java中,为了从相对路径读取文件,经常会使用的方法便是: xxx.class.getResource(); xxx.class.getClassLoader().getResource(); 在S ...

  4. Spring Resource和ResourceLoader源码解析

    Spring用Resource接口抽象所有的底层资源,包括File.ClassPath.URL等.ResourceLoader接口是Resource的加载器,根据资源的路径/路径模式获取Resourc ...

  5. Spring @Resource

            @Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,面 @Resource 默认按 byName 自动注入罢了.@Reso ...

  6. Spring @Resource详解

    @Resource主要做依赖注入,从容器中自动获取bean,作用如下: 在启动Spring时,首先要启动容器 在启动Sprng容器时,会默认寻找容器扫描范围内的可加载的bean,然后查找哪些bean上 ...

  7. Spring @Resource 源码解析 – 为什么是ByName注入

    前言 上篇博客[@Autowired 源码为什么是ByType注入]跟着源码详细的说明了@Autowired在Spring源码里面是如何设计为byType注入的.本篇博客的主要内容就是源码追踪探究@R ...

  8. Spring @Resource、@Autowired、@Qualifier区别

    @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入: @Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualif ...

  9. spring resource

    1.resource的前生后世 前生:public interface Resource extends InputStreamSource public interface InputStreamS ...

  10. Spring资源加载器抽象和缺省实现 -- ResourceLoader + DefaultResourceLoader(摘)

    概述 对于每一个底层资源,比如文件系统中的一个文件,classpath上的一个文件,或者一个以URL形式表示的网络资源,Spring 统一使用 Resource 接口进行了建模抽象,相应地,对于这些资 ...

最新文章

  1. JS数组转字符串和字符串转数组
  2. Xgboost实现GPU加速
  3. 图像降噪算法——时域降噪算法
  4. java 2d 教程_Java 2D开发技巧之“灯光与阴影”
  5. java integer valueof_一文读懂什么是Java中的自动拆装箱
  6. java里有哪些对象_Java中创建对象的方式有哪些
  7. java 多线程4: java线程的优先级
  8. 使用HTML5构建iOS原生APP(2)
  9. 因式分解题目及过程_两道新定义题目的对比分析
  10. fetch_lfw_people相关
  11. 老杜java_老杜最新Java零基础视频教程(适合Java 0基础,Java初学入门)
  12. 机器人油封_机器人油封 机器人减速机 机器人伺服电机油封 KVNOK油封
  13. html中设置背景图片为平铺,html背景图片怎么设置平铺方式
  14. 泡泡龙游戏的完整制作流程
  15. OpenCV——图像矩
  16. [shell] sed 插入多行文本
  17. 开源一个自动录制直播上传投稿的项目
  18. 【python】解决给文件写入汉字,中文字符乱码问题
  19. 安全杂记二(网络安全威胁)
  20. MainWindow漫谈

热门文章

  1. 《Man Vs wild》 Notes-法国阿尔卑斯山
  2. ie打开完成,网页显示空白
  3. 【深入理解JVM】ClassLoader类加载机制
  4. [Usaco2008 Feb]Eating Together麻烦的聚餐
  5. FixedThreadPool吞掉了异常
  6. 十份图表改变您对大数据增长的观点
  7. SFP模块光信号强度知识介绍
  8. iOS编程上获取本地时间以及星期几时间
  9. 在WPF程序中打开网页:使用代理服务器并可进行JS交互
  10. 使用OpenLDAP作为身份验证源