资源表示:Resource
Spring框架内部使用org.springframework.core.io.Resouce接口作为所有资源的抽象和访问接口。

它继承了 org.springframework.core.io.InputStreamSource接口。作为所有资源的统一抽象,Source 定义了一些通用的方法,由子类 AbstractResource 提供统一的默认实现。定义如下:

public
interface Resource extends InputStreamSource {

/**

* 资源是否存在

*/

boolean exists();

/**

* 资源是否可读

*/

default boolean isReadable() {

return true;

}

/**

* 资源所代表的句柄是否被一个stream打开了

*/

default boolean isOpen() {

return false;

}

/**

* 是否为 File

*/

default boolean isFile() {

return false;

}

/**

* 返回资源的URL的句柄

*/

URL getURL() throws IOException;

/**

* 返回资源的URI的句柄

*/

URI getURI() throws IOException;

/**

* 返回资源的File的句柄

*/

File getFile() throws IOException;

/**

* 返回 ReadableByteChannel

*/

default ReadableByteChannel
readableChannel() throws IOException {

return
Channels.newChannel(getInputStream());

}

/**

* 资源内容的长度

*/

long contentLength() throws IOException;

/**

* 资源最后的修改时间

*/

long lastModified() throws IOException;

/**

* 根据资源的相对路径创建新资源

*/

Resource createRelative(String
relativePath) throws IOException;

/**

* 资源的文件名

*/

@Nullable

String getFilename();

/**

* 资源的描述

*/

String getDescription();

}

Resouce接口可以根据资源的不同类型,或者资源位置的不同,给出对应的具体实现,Spring框架提供了一些实现类:

ByteArrayResource。将字节数组作为资源进行封装,如果通过InputStream形式访问该类型的资源,该实现会根据字节数组的数据,构造出对应的ByteArrayInputStream并返回。

ClassPathResource。从Java应用的classpath中加载具体的资源并封装,可以使用指定的类加载器或者给定的类进行资源加载。

FileSystemResource。对
java.io.File 类型资源的封装,只要是跟 File 打交道的,基本上与 FileSystemResource 也可以打交道。支持文件和 URL 的形式,实现 WritableResource 接口,且从 Spring Framework 5.0 开始,FileSystemResource 使用NIO.2 API进行读/写交互

UrlResource。通过java.net.URL进行具体资源查找定位的实现类。

InputStreamResource。将给定的InputStream视为一种资源的Resource实现类。

资源加载:ResourceLoader

在Spring框架中,ResourceLoader是资源查找定位策略的统一抽象,具体的资源查找定位策略由相应的ResourceLoader实现类给出。

org.springframework.core.io.ResourceLoader 为 Spring 资源加载的统一抽象,具体的资源加载则由相应的实现类来完成,所以我们将 ResourceLoader 称作为统一资源定位器。定义如下:

public interface ResourceLoader {

String CLASSPATH_URL_PREFIX = ResourceUtils.CLASSPATH_URL_PREFIX;

Resource getResource(String location);

ClassLoader getClassLoader();

}

ResourceLoader 接口提供两个方法:getResource()、getClassLoader()。

getResource()根据所提供资源的路径 location 返回 Resource 实例,但是它不确保该
Resource 一定存在,需要调用 Resource.exist()方法判断。该方法支持以下模式的资源加载:

URL位置资源,如”file:C:/test.dat”

ClassPath位置资源,如”classpath:test.dat”

相对路径资源,如”WEB-INF/test.dat”,此时返回的Resource实例根据实现不同而不同

getClassLoader() 返回
ClassLoader 实例,对于想要获取 ResourceLoader 使用的 ClassLoader 用户来说,可以直接调用该方法来获取,

对于想要获取 ResourceLoader 使用的 ClassLoader 用户来说,可以直接调用 getClassLoader() 方法获得。在分析 Resource 时,提到了一个类 ClassPathResource ,这个类是可以根据指定的 ClassLoader 来加载资源的。

阅读之spring框架的更多相关文章

  1. Spring框架之spring-web http源码完全解析

    Spring框架之spring-web http源码完全解析 Spring-web是Spring webMVC的基础,由http.remoting.web三部分组成. http:封装了http协议中的 ...

  2. Spring框架之spring-web web源码完全解析

    Spring框架之spring-web web源码完全解析 spring-web是Spring webMVC的基础,由http.remoting.web三部分组成,核心为web模块.http模块封装了 ...

  3. Spring框架源码阅读之Springs-beans(一)容器的基本实现概述(待续)

    去年通过实际框架代码的阅读,以及结合<Spring源码深度解析>和<Spring技术内幕>的阅读,对Spring框架内Bean模块有了一个整体性的认识.对此进行的总结性整理和回 ...

  4. [Spring框架]Spring AOP基础入门总结一.

    前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect ...

  5. 《经久不衰的Spring框架:SpringMVC 统括》

    前言:经久不衰的Spring 这几年,前端技术更新换代速度之快,每一年"最火的前端技术"排行榜都会换一番场景,本当に信じかねる.是"只闻新人笑不见旧人哭",还是 ...

  6. Spring框架学习1

    AnonymouL 兴之所至,心之所安;尽其在我,顺其自然 新随笔 管理   Spring框架学习(一)   阅读目录 一. spring概述 核心容器: Spring 上下文: Spring AOP ...

  7. spring框架(1)— 依赖注入

    依赖注入 spring核心容器就是一个超级大工厂,所以的对象(数据源.hibernate SessionFactory等基础性资源)都会被当做spring核心容器的管理对象——spring把容器中的一 ...

  8. spring框架入门day01

    struts:web层,比较简单(ValueStack值栈,拦截器) hibernate:dao层,知识点杂 spring:service层,重要,讲多少用多少  --> [了解] spring ...

  9. Spring框架配置beans.xml扩展

    Spring学习笔记(二) 续Spring 学习笔记(一)之后,对Spring框架XML的操作进行整理 1 什么是IOC(DI) IOC = inversion of control   控制反转 D ...

随机推荐

  1. 开源录屏软件Open Broadcaster Software

    Open Broadcaster Software是一款开源录屏软件,功能强大,设计合理,其官方网址是https://obsproject.com/

  2. python学习之模块-模块(四)

    5.9 logging模块 常用参数 logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有: filename:用指定的文件名创建FiledHan ...

  3. 前端,后端,UI,UE,UX,区别到底在哪里?

    前端后端,到低区别在哪里? 其实后端是负责更为复杂的数据逻辑,表处理结构,如何实现一连串的数据提交,包括,数据验证,数据影响,数据计算,数据提取,,,等等. 那么前端负责的是什么呢?数据展示,数据验证 ...

  4. AJAX得基本使用

    直接上案例:

  5. Vue.js官方文档学习笔记(一)起步篇

    Vue.js起步 Vue.js介绍 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库 ...

  6. 初相识|performance_schema全方位介绍

    初相识|performance_schema全方位介绍 |导 语 很久之前,当我还在尝试着系统地学习performance_schema的时候,通过在网上各种搜索资料进行学习,但很遗憾,学习的效果并不 ...

  7. js中this.index使用

    上面圈出的那句没有执行,因为this.index 是undefined,(也不能直接使用i取代this.index,原因是i不是变化的值,使用alert打印输出的i值始终为3) 解决方式:在for语句 ...

  8. HDU-3714 Error Curves(凸函数求极值)

    Error Curves Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  9. 如何解决 u盘 错误0x80071AC3:请运行chkdsk并重试

    windows: 一.win+R 打开 cmd 二.确认好U盘在电脑上显示的盘符,输入代码:chkdsk G:/f (G为U盘所在盘符) Bonus:U盘一般会有文件系统,主要有NTFS.FAT16. ...

  10. kafka工作原理

    https://blog.csdn.net/qq_29186199/article/details/80827085 https://www.jianshu.com/p/4bf007885116 ht ...