转载

探索SpringBoot-一起看看Spring源码之Resource(十)

上期讲了 Spring IoCrefresh 函数,详情请见 探索SpringBoot-一起看看Spring核心源码之refresh(九) ,今天暂时缓一缓,毕竟后面的知识还得好好理一理。之前用力过猛,我们还得打牢固一些基础知识。比如在看 refresh 函数源代码的过程中,不知道你有没有发现所有的 Spring 的资源都是通过 Resource 来访问的。 Spring 会先将所有的资源转化为特定的 Resource 对象,之后才会对其访问。 那么这个 Resource 到底是什么呢?

Resource

Resource的用途

一般,我们启动 IoC 容器的时候是下面这样的。

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/context.xml");
复制代码

即使我们不看源代码,我们也能够知道对于 META-INF/context.xmlSpring 内部一定会有一个根据这个地址获取实际的 XML 文件的信息的代码。

那么 Spring 具体是怎么做到的呢?

答案就是使用 Resource 。在 Spring 内部的所有资源,包括File,ClassPath,URL都会转化为 Resource 统一对外提供服务。

比如上面这个最简单在 refresh 函数的过程中是这么转化的。

Resource[] resources = ((ResourcePatternResolver) resourceLoader).getResources(location);
复制代码

没错,很明显,虽然我们不知道 resourceLoader 是干嘛的。但是,这段代码也非常容易理解,就是把 location 下面的 XML 文件转化为了 Resource 资源。

为什么要有Resource

因为在 Java 中传统的访问资源的方式是通过 URL 来抽象的。如果不记得 URL 抽象了,请翻一翻大学时候的 Java 基础教材。一般是这样来使用的。

URL url = new URL("http://www.runoob.com/index.html?language=cn#j2se");
     System.out.println("URL 为:" + url.toString());
复制代码

那么如果要获取相对于 classpath 下面的文件呢?传统的 Java 是怎么做的呢?首先第一步是要获得 URL ,之后才能获取这个 URL 中存在的文件。之后才能用 File 对象来包装生成。

URL url = LearnResource.class.getClassLoader().getResource("meta-inf/context.xml");
        System.out.println(url.getFile());
        File file = new File(url.getFile());
        System.out.println(file.exists());
复制代码

所以,直接使用 URL 获得 classpath 下面的资源还是比较复杂的。

另外,对于 URL 抽象来说,也没有提供一些基本的方法。比如,检查当前资源是否存在、检查当前资源是否可读等方法都是没有。

因此, Spring 使用到自己的 Resource 来对上述 classpath 下面的文件的访问进行了一次封装。

有了 Resource 之后,那么可以的怎么访问对应文件资源呢?一行搞定。是不是很简单。

ClassPathResource classPathResource = new ClassPathResource("meta-inf/context.xml");
复制代码

Resource的结构

Spring 设计了 Resource 接口对外暴露资源的所有的访问方式。 Resource 继承了 InputSteamSource 来提供 getInputStream 方法来获取 InputStream 。 另外还提供了 getFile , exists , isReadable , getURL 等。

对于不同的资源路径,来提供了不同的对象来对象访问比如 ClassPathResourceFileSystemResource 来分别访问类路径下,文件系统路径下的资源。

最后附上一张 Resource 的继承类图。

探索SpringBoot-一起看看Spring源码之Resource(十)

想到一些之后继续补充的点,一些 ClassLoader 的具体的实现内容,可以考虑再想想,之后讲解下。这篇还是先基本的介绍下 Resource

关于写作

以后这里每天都会写一篇文章,题材不限,内容不限,字数不限。尽量把自己每天的思考都放入其中。

如果这篇文章给你带来了一些帮助,可以动动手指点个赞,顺便关注一波就更好了。

如果上面都没有,那么写下读完之后最想说的话?有效的反馈和你的鼓励是对我最大的帮助。

另外打算把博客给重新捡起来了。欢迎大家来访问吃西瓜。

我是shane。今天是2019年8月17日。百天写作计划的第二十四天,24/100。

原文  https://juejin.im/post/5d5805a4f265da03970bb6e9
正文到此结束
Loading...