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

前文回顾

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

Resource

Resource的用途

通常,咱们启动IoC容器的时候是下面这样的。java

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

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

那么Spring具体是怎么作到的呢?函数

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

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

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

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

为何要有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对象来包装生成。code

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下面的资源仍是比较复杂的。cdn

另外,对于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的继承类图。

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

关于写做

之后这里天天都会写一篇文章,题材不限,内容不限,字数不限。尽可能把本身天天的思考都放入其中。

若是这篇文章给你带来了一些帮助,能够动动手指点个赞,顺便关注一波就更好了。

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

另外打算把博客给从新捡起来了。欢迎你们来访问吃西瓜

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

相关文章
相关标签/搜索