spring对JDK中的资源访问
JDK的资源访问
在JDK中对资源的访问方式
URL:抽象对网络访问的资源目录。但是缺少例如isExist() isOpen()等方法
IO:提供了对于文件 二进制流等的抽象。
但是缺少了类相对路径 servlet相对路径的的资源访问。
URL获得资源方式
//获得InputStream方法
URL url = new URL("");
URLConnection connection = url.openConnection();
connection.getInputStream();
//查看文件类型方法
URL url = new URL("");
//获得URL协议
String protocol = url.getProtocol();
//如果为文件协议
if("file".equal(protocol)){
}else if(protocol.startWith("vfs:")){//如果为vfs协议
}
ClassPath获得资源
ClassLoader loader = this.getClass().getClassLoader();
InputStream in = loader.getResourceAsStream();
Servlet获得相对资源
InputStream in = servletContext.getResourceAsStream();
JDK提供了很多中资源访问的接口,但是获得资源的方法并不统一,也缺少一些很使用的资源访问方式
spring 解决之道
spring对所有的资源抽象为Resource接口,这个接口定义了一系列的方法,统一了对资源的访问
通过内置提供大量的实现提供访问资源的子类,提供了很多常用的资源访问方式
ResourceLoader
spring实现如此众多的资源访问类,那我们客户端如何进行调用呢。
一.客户端必须知道这些子类知识,手动去创建这些资源子类
二.服务器端提供一个统一解析的接口,通过一定的命名规则,
自动创建这些子类。这样客户端就需要很少具体实现的知识。
真正做到了面向接口编程,客户端不依赖子类实现。
总结
统一访问问题
spring通过定义一个Resource解决了IO URL获得资源访问接口的不一致
并提供了一些基本方法
加载资源问题
spring通过一个ResourceLoader接口DefaultResourceLoader
实现类,解决了资源加载问题,客户端只传入字符串便可加载资源,
避免了客户端和实现之间的耦合。
编码层面上
Resource 接口
AbstractResource 抽象,对Resource的骨架实现