深入了解 Java Resource && Spring Resource
在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 ClassLoader
,EtxClassLoader
,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(