一、一切资源的加载都是通过类加载器完成的,通过以下几个方法实现
1、URL getResource(String name) 委托模式,先委托父类加载器加载,如果加载不到,在调用自己的findResource()方法加载
2、InputStream getResourceAsStream(String name) 其实是调用 1 方法而已
3、URL findResource(String name) 类加载器自己需要实现的方法
二、加载资源的具体方法
1、通过Class 对象进行资源加载,使用如下两个方法
java.net.URL getResource(String name)
InputStream getResourceAsStream(String name)
它会通过本类的类加载器加载来资源(其实还是使用类加载器来加载资源)。
这些方法会先对资源名进行解析处理,处理方法如下:
(1)如果name 以 / 开头,则资源文件名为 / 后面部分
(2)如果不以 / 开头,则资源文件名为 当前类的包名/name,包名中的 . 用 / 替换
如:加载 类路径下的 config.properties 文件
URL url = PropertiesFilesUtils.class.getResource("/config.properties");
加载 类路径下 org.apache.ibatis 这个包
URL url = PropertiesFilesUtils.class.getResource("/org/apache/ibatis");
或者 PropertiesFilesUtils.class.getClassLoader().getResource("org/apache/ibatis"); //注意和上一个的不同
2、通过类加载器来加载资源
URL getResource(String name)
InputStream getResourceAsStream(String name)
Enumeration<URL> getResources(String name)
他们会根据各自类加载器的实现不同,分别从不同的地方来加载资源,所有的name 都是相对于自己的加载路径
三、jvm中的类加载器
jvm默认有三个类加载器
AppClassLoader(System类加载器) 加载CLASSPATH路径下的包和类
ExtClassLoader 加载/jre/lib/ext/目录下的扩展包
BootstrapClassLoader 加载jre/目录下的核心库
我们自定义的类加载器,默认的的父类加载器是AppClassLoader