Spring 源码第一篇开整!配置文件是怎么加载的?( 三 )

  1. 首先,ClassPathResource 的构造方法有四个,一个已经过期的方法我这里没有列出来 。另外三个,我们一般调用一个参数的即可,也就是传入文件路径即可,它内部会调用另外一个重载的方法,给 classloader 赋上值(因为在后面要通过 classloader 去读取文件) 。
  2. 在 ClassPathResource 初始化的过程中,会先调用 StringUtils.cleanPath 方法对传入的路径进行清理,所谓的路径清理,就是处理路径中的相对地址、windows 系统下的 \ 变为 / 等 。
  3. getPath 方法用来返回文件路径,这是一个相对路径,不包含 classpath 。
  4. resolveURL 方法表示返回资源的 URL,返回的时候优先用 Class.getResource 加载,然后才会用 ClassLoader.getResource 加载,关于 Class.getResource 和 ClassLoader.getResource 的区别,又能写一篇文章出来,我这里就大概说下,Class.getResource 最终还是会调用 ClassLoader.getResource,只不过 Class.getResource 会先对路径进行处理 。
  5. getInputStream 读取资源,并返回 InputStream 对象 。
  6. createRelative 方法是根据当前的资源,再创建一个相对资源 。
这是 ClassPathResource,另外一个大家可能会接触到的 FileSystemResource ,小伙伴们可以自行查看其源码,比 ClassPathResource 简单 。
如果不是使用 Spring,我们仅仅想自己加载 resources 目录下的资源,也可以采用这种方式:
ClassPathResource resource = new ClassPathResource("beans.xml");InputStream inputStream = resource.getInputStream();拿到 IO 流之后自行解析即可 。
在 Spring 框架,构造出 Resource 对象之后,接下来还会把 Resource 对象转为 EncodedResource,这里会对资源进行编码处理,编码主要体现在 getReader 方法上,在获取 Reader 对象时,如果有编码,则给出编码格式:
public Reader getReader() throws IOException { if (this.charset != null) {  return new InputStreamReader(this.resource.getInputStream(), this.charset); } else if (this.encoding != null) {  return new InputStreamReader(this.resource.getInputStream(), this.encoding); } else {  return new InputStreamReader(this.resource.getInputStream()); }}所有这一切搞定之后,接下来就是通过 XmlBeanDefinitionReader 去加载 Resource 了 。
4.小结好啦,今天主要和小伙伴们分享一下 Spring 中的资源加载问题,这是容器启动的起点,下篇文章我们来看 XML 文件的解析 。
如果小伙伴们觉得有收获,记得点个在看鼓励下松哥哦~

【Spring 源码第一篇开整!配置文件是怎么加载的?】


推荐阅读