Spring源码解析2---> 核心组件装配

Spring源码解析2—> 核心组件装配

前言

第一篇文章,我们大体上对Spring如何加载对象有了一个大体的了解,这一篇我们书接上回,尽可能去挖掘里面有意思的东西。

Spring加载对象的一般过程

1. 加载资源文件
2. 资源文件抽象化
3. 定义一个装载Bean对象的工厂
4. 定义一个beandefinitionReader以装配beanFactory
5. beanDefinitionReader读取资源文件
6. 以上完成资源文件的读取以及装配对象至beanFactory

说实话,我自己看着都有点抽象,但是确实是自己总结出来的,这一篇博文先简单概述下前三点,就是对应下面两行代码:

Resource resource = new ClassPathResource("applicationContext.xml");

DefaultListableBeanFactory factory = new DefaultListableBeanFactory();

Resource就是个什么东西?

其实Resource并不难理解,我们先简单看一下代码:

Resource resource = new ClassPathResource("applicationContext.xml");

忘记前面的知识,我们点进去源码看看
在这里插入图片描述

这个说的是什么?针对于像文件或者类路径下的资源的抽象,简单点说就是把一个真实的资源给抽象化!这里我们留下个疑问,并且仔细看这里面它extends InputStreamResource,里面的

InputStream getInputStream() throws IOException;

说的很清楚了,获取资源的流!!!这里面很重要很重要

我们这里读取的是类路径下的文件,且Resource是接口,那么就看下它的实现类吧
在这里插入图片描述

其实下面,这个不难理解,它是Resource接口的具体实现,因此首先可以判断的是将类路径下的资源进行了抽象化,下面进行简单的联想:

我们平时在进行文件数据的读取的时候,一般情况下是:
FileOutputStream fos = new FileOutputStream();
fos.write("xxx");
FileInputStream fis = new FileInputStream(new File("xxx.xml"));

以上这种形式,文件流的输入与输出,同比于我们的
Resource resource = new ClassPathResource("xxx");
我们上面标记过重点!Resource这个接口继承了InputStream这个接口,这个接口里面是有一个方法的
getInputStream()返回值是 Inputsatream一个输入流,用来读取
上面的FileInputStream这个东西说的很明白了它是进行了文件IO的操作将数据从A点到B点进行传输
或者说是将内存数据转移到一个能够被其他对象以合适的方法进行读取!
实际上我们ClassPathResource()差不多,它是把资源文件进行抽象化,以一种抽象类型的数据模型,被其他可适配的类型去读取,去加载,至于怎么加载怎么抽象后面去研究,这里还只是个引子。

DefaultListBeanFactory

老规矩先看代码:
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();

这一行我们知道,它是存放spring中bean对象的,其实我这里面还是有点疑惑的,我也不知道为什么会有这个疑惑这个DefaultListBeanFactory里面存档的是真正的bean对象还是存放的是生成Bean的相关信息?内心很纠结,我内心是有一个答案的,我想需要去验证,先放在这里

结构图如下:
在这里插入图片描述

先看最主要的一点: 它的最上层的接口是BeanFactory

我们来复习下概念:
Java的三大特性:
1. 封装
2. 继承
3. 多态

其中的继承为: 子类继承父类,拥有父类的部分特性或在此基础上进行扩充或重写也就是说: 子类是父类的超集
接口呢,按照上面的语义也有类似的功能,但是接口定义的更多的是规范,需要实现类自己去实现接口里面所定义的方法。

那么就不难解释为什么这么长一大串了!因为上面的接口里面有我们的DefaultListBeanFactory必须实现的方法们这里又不得不说一点:
接口隔离原则
这就是为什么跟我们平常写的代码不一样的原因,如果严格遵守规范那么一个接口就可能按照不同的维度去区分,展开说下:
一个班可能有蓝孩子还有绿孩子,可以按照性别的维度去区分,有优良中差之分(我好像一直都是良,小红花一般我也么得。。小时候我经常偷偷去最后一排吃好吃的,还拉着同桌一起去最后面吃!幼儿园吖,小时候就。。一言难尽)也可以按照这个维度去划分。。。明明可以一个接口搞定的对吧,最起码我是认识的,但是看看人家这个可拓展性!强~按照一个接口解决的话,那完了,重构吧,所以可拓展性与项目的设计是有很大关系的,项目小,用户少,那你开心就好。

下面简单看下BeanFactory说明:
在这里插入图片描述

重点看这句就可以了,说的是什么呢,bean容器的最底层接口,下面我们看下面的方法
在这里插入图片描述

这里面有我们获取bean对象的方法

Object getBean(String name) throws BeansException;

这个就对应了我们在最上面所说的!为何DefaultListBeanFactory要实现BeanFactory的方法,因为BeanFactory里面有我们所需要的方法!下面我们来看下DefaultListBeanFactory这个具体的实现类,如下图:
在这里插入图片描述

大概说的意思是: 这俩接口的实现,第一个接口ConfigurableListableBeanFactory这个没啥说的,上面的类图有,下面这个BeanDefinitionRegistry我们不妨大胆的猜一下是不是说将beanBactory与资源读取起联系起来,毕竟工厂建立起来是需要填充内容的,这个时候就需要一个内容读取器这里叫BeanDefinitionRegistry,这一切只是我们的猜的,我们一点点慢慢探究,就当打怪了,后面有一句话很有意思: extensible through post-processors,意思是通过spring的后置处理器去拓展,没懂。。什么意思!拓展什么?切面么?AOP么?后面再研究,问题先提出来,这一篇就先到这里了,再见诸位。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值