Java中,为了从相对路径读取文件,经常会使用的方法便是:

xxx.class.getResource();  xxx.class.getClassLoader().getResource();

Spring中,我们还可以通过Spring提供的Resource进行一些操作:

ClassPathResource  FileSystemResource  ServletContextResource  Resource template = ctx.getResource("some/resource/path/myTemplate.txt");

这里简单总结下他们的区别:


ClassLoader##getResource()

这个方法是今天的主角。

我们都知道ClassLoader的作用是用来加载.class文件的,并且ClassLoader是遵循Java类加载中的双亲委派机制的。

那么,ClassLoader是如何找到这个.class文件的呢?答案是URLClassPath

Java中自带了3个ClassLoader分别是BootStrap ClassLoaderEtxClassLoader,AppClassLoader,

这3个ClassLoader都继承自URLClassLoader,而URLClassLoader中包含一个URLClassPath用来记录每个ClassLoader对应的加载.class文件的路径,当需要加载资源的时候,只管从URLClassPath对应的路径查找即可。

下面是测试代码:

System.out.println("BootStrap ClassLoader "); Stream.of(System.getProperty("sun.boot.class.path").split(";")).forEach(System.out::println);  System.out.println("ExtClassLoader:");   Stream.of(System.getProperty("java.ext.dirs").split(";")).forEach(System.out::println);  System.out.println("AppClassLoader:");   Stream.of(System.getProperty("java.class.path").split(