目录
一、资源抽象接口
1、传统java中的资源加载
通过ClassLoader类加载器进行的。代码如下:
Thread.currentThread().getContextClassLoader().getResource("com/demo/SimpleJava.class");
SimpleJava.class.getClassLoader().getResource("com/demo/SimpleJava.class");
ClassLoader.getSystemResource("com/demo/SimpleJava.class");
SimpleJava.class.getResource("SimpleJava.class");
每个类加载器加载资源时,都有自己固定的位置,也就是实例化类加载器时传递的url,相当于类加载器加载的资源的仓库,也只会在自己的的仓库中寻找资源,而classPath下的资源,都是AppClassLoader类进行加载。
对于通过SimpleJava.class.getResource进行的资源加载,我们可以通过分析源码:
//这是class类中进行资源加载的方法
public java.net.URL getResource(String name) {
name = resolveName(name); //通过解析资源名称,如果是以/开头,会在classpath下找寻,name必须为包含全限定名称的路径。
//上面的例子中SimpleJava.class.getResource("SimpleJava.class")的路径可以换成:/com/demo/SimpleJava.class,如果不是以/开头,则会在相对于SimpleJava.class的目录下找寻。
ClassLoader cl = getClassLoader0();
if (cl==null) {
return ClassLoader.getSystemResource(name);
}
return cl.getResource(name);
}
2、Spring中的Resource接口
传统的Java资源文件的访问通过JDK中的File、URL类难以满足各种不同需求的资源加载,这里有Spring中设计的org.springframework.core.io.Resource接口提供更加强大的访问底层资源的能力。
下面是Resource接口的主要方法:
boolean exists():资源是否存在;
boolean isOpen():资源是否打开;
URL getURL() throws IOException:如果底层资源可以表示成URL,该方法返回对应的URL对象;