文章目录
spring如何处理资源(Resource),我们如何在spring中和资源(Resource)工作呢?
1 介绍
java.net.URL
可以处理各种复杂的URL(统一资源定位),缺点是对于所有访问底层资源的能力还不够
例如还没有一种URL的实现可以访问需要从类路径或相对于ServletContext获得的资源虽然可以为专门的URL前缀注册新的处理程序(类似于现有的用于前缀的处理程序,如http:),但这通常非常复杂。而且URL接口仍然缺少一些需要的功能,比如检查被指向的资源是否存在的方法
思考:Resource接口是用来解决什么问题的?即URL接口的这些不足。
2 Resource 接口
比URL接口更强,用于抽象对底层资源的访问。
对比URL接口,Resource接口有何不同,URL表示一个统一的资源定位符,一个指向万维网上“资源”的指针,相较于Resource更加侧重于web资源,且无法判断资源是否存在
相较于URL Resource接口实现资源的抽象,可以检查资源是否存在。
URL
protocol,host,port,authority,file,ref
resource接口提供哪些功能?
判断 | 提供资源 | 其他 |
---|---|---|
isReadable | URL | createRelative |
isOpen | URI | contentLength |
isFile | File | lastModified |
exists | InputStream | ReadableByteChannel |
通过字符串路径上的特殊前缀,指定必须创建和使用特定的资源实现,例如:ftp,http,file
资源抽象不能代替功能。在可能的地方进行包装。例如,UrlResource包装一个URL并使用包装后的URL来完成它的工作。
Resource接口的子类有以下这些
3 spring为我们提供了哪些内置的Resource实现
UrlResource
ClassPathResource
FileSystemResource
ServletContextResource
InputStreamResource
ByteArrayResource
3.1 URLResource
包装了URL接口,可以用来访问File,Http,ftp等其他对象,UrlResource是由Java代码显式地使用UrlResource构造函数创建的,但通常在调用API方法时隐式地创建,该方法接受一个表示路径的字符串参数。对于后一种情况,JavaBeans PropertyEditor最终决定创建哪种类型的资源。路径字符串包含众所周知的(也就是)前缀(例如classpath:),它为该前缀创建一个适当的专门化资源。但是,如果它不识别前缀,则假定该字符串是标准URL字符串,并创建一个UrlResource。
PropertyEditor
3.2 ClassPathResource
从类路径下获取(classpath),隐式创建当字符串路径上的特殊前缀classpath:,PropertyEditor将创建一个ClassPathResource实例
3.3 FileSystemResource
File和Path 的Resource实现,支持解析File和URL
3.4 InputStreamResource
InputStream的Resource实现,只有在没有特定的资源实现可用时,才应该使用它。特别是,尽可能选择ByteArrayResource或任何基于文件的资源实现。如果您需要将资源描述符保存在某个地方,或者需要多次读取流,请不要使用它
3.5 ByteArrayResource
这是一个给定字节数组的资源实现。它为给定的字节数组创建一个ByteArrayInputStream。它对于从任何给定的字节数组加载内容都很有用,而不必求助于一次性使用的InputStreamResource
classpath: | ClassPathResource |
---|---|
File,Path | FileSystemResource |
InputStreamResource | 尽量不用 |
ByteArrayResource | byte array --ByteArrayInputStream |
4 ResourceLoader 资源加载
由可以返回(即加载)资源实例的对象来实现的。
public interface ResourceLoader {
Resource getResource(String location);
}
applicationcontext于resouce的关系,如果没有指定特殊前缀,将获得适合于特定应用程序上下文的资源类型
上下文类型 |
---|