第六十二章 Spring之假如让你来写Boot——番外篇:重构BeanFactory

Spring源码阅读目录

第一部分——IOC篇

第一章 Spring之最熟悉的陌生人——IOC
第二章 Spring之假如让你来写IOC容器——加载资源篇
第三章 Spring之假如让你来写IOC容器——解析配置文件篇
第四章 Spring之假如让你来写IOC容器——XML配置文件篇
第五章 Spring之假如让你来写IOC容器——BeanFactory和FactoryBean
第六章 Spring之假如让你来写IOC容器——Scope和属性填充
第七章 Spring之假如让你来写IOC容器——属性填充特别篇:SpEL表达式
第八章 Spring之假如让你来写IOC容器——拓展篇
第九章 Spring之源码阅读——环境搭建篇
第十章 Spring之源码阅读——IOC篇

第二部分——AOP篇

第十一章 Spring之不太熟的熟人——AOP
第十二章 Spring之不得不了解的内容——概念篇
第十三章 Spring之假如让你来写AOP——AOP联盟篇
第十四章 Spring之假如让你来写AOP——雏形篇
第十五章 Spring之假如让你来写AOP——Joinpoint(连接点)篇
第十六章 Spring之假如让你来写AOP——Pointcut(切点)篇
第十七章 Spring之假如让你来写AOP——Advice(通知)上篇
第十八章 Spring之假如让你来写AOP——Advice(通知)下篇
第十九章 Spring之假如让你来写AOP——番外篇:Spring早期设计
第二十章 Spring之假如让你来写AOP——Aspect(切面)篇
第二十一章 Spring之假如让你来写AOP——Weaver(织入器)篇
第二十二章 Spring之假如让你来写AOP——Target Object(目标对象)篇
第二十三章 Spring之假如让你来写AOP——融入IOC容器篇
第二十四章 Spring之源码阅读——AOP篇

第三部分——事务篇

第二十五章 Spring之曾经的老朋友——事务
第二十六章 Spring之假如让你来写事务——初稿篇
第二十七章 Spring之假如让你来写事务——铁三角篇
第二十八章 Spring之假如让你来写事务——属性篇
第二十九章 Spring之假如让你来写事务——状态篇
第三十章 Spring之假如让你来写事务——管理篇
第三十一章 Spring之假如让你来写事务——融入IOC容器篇
第三十二章 Spring之源码阅读——事务篇

第四部分——MVC篇

第三十三章 Spring之梦开始的地方——MVC
第三十四章 Spring之假如让你来写MVC——草图篇
第三十五章 Spring之假如让你来写MVC——映射器篇
第三十六章 Spring之假如让你来写MVC——拦截器篇
第三十七章 Spring之假如让你来写MVC——控制器篇
第三十八章 Spring之假如让你来写MVC——适配器篇
第三十九章 Spring之假如让你来写MVC——番外篇:类型转换
第四十章 Spring之假如让你来写MVC——ModelAndView篇
第四十一章 Spring之假如让你来写MVC——番外篇:数据绑定
第四十二章 Spring之假如让你来写MVC——视图篇
第四十三章 Spring之假如让你来写MVC——上传文件篇
第四十四章 Spring之假如让你来写MVC——异常处理器篇
第四十五章 Spring之假如让你来写MVC——国际化篇
第四十六章 Spring之假如让你来写MVC——主题解析器篇
第四十七章 Spring之假如让你来写MVC——闪存管理器篇
第四十八章 Spring之假如让你来写MVC——请求映射视图篇
第四十九章 Spring之假如让你来写MVC——番外篇:属性操作
第五十章 Spring之假如让你来写MVC——融入IOC容器篇
第五十一章 Spring之源码阅读——MVC篇

第五部分——Boot篇

第五十二章 Spring之再进一步——Boot
第五十三章 Spring之假如让你来写Boot——环境篇
第五十四章 Spring之假如让你来写Boot——注解篇(上)
第五十五章 Spring之假如让你来写Boot——注解篇(下)
第五十六章 Spring之假如让你来写Boot——SPI篇
第五十七章 Spring之假如让你来写Boot——配置文件篇(上)
第五十八章 Spring之假如让你来写Boot——配置文件篇(下)
第五十九章 Spring之假如让你来写Boot——番外篇:再谈Bean定义
第六十章 Spring之假如让你来写Boot——自动装配篇
第六十一章 Spring之假如让你来写Boot——番外篇:杂谈Starter
第六十二章 Spring之假如让你来写Boot——番外篇:重构BeanFactory
第六十三章 Spring之假如让你来写Boot——番外篇:再谈ApplicationContext
第六十四章 Spring之假如让你来写Boot——内嵌Web容器篇
第六十五章 Spring之假如让你来写Boot——Main方法启动篇
第六十六章 Spring之最终章——结语篇



前言

    对于Spring一直都是既熟悉又陌生,说对它熟悉吧,平时用用没啥问题,但面试的时候被问的一脸懵逼,就很尴尬,都不好意思在简历上写着熟悉Spring了
在这里插入图片描述

    所以决定花点时间研究研究Spring的源码。主要参考的书籍是:《Spring源码深度解析(第2版)》、《Spring揭秘》、《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》


     书接上回,在上篇 第六十章 Spring之假如让你来写Boot——自动装配篇 中,A君 昨天已经完成了自动装配这一大功能,自动装配可以说是 Boot 的半壁江山,剩下的东西也不多了。。。

尝试动手写IOC容器

    出场人物:A君(苦逼的开发)、老大(项目经理)

    背景:老大 要求 A君在一周内开发个简单的 IOC容器

    前情提要:A君 已经完成了自动装配这一大功能。。。

重构BeanFactory

    在之前的版本中,A君 为了简单,没有给BeanFactory加上太多的东西,基本上保持着能用就行了态度,实现不行才加上点东西。到了现在,又是注解,又这那的。还是只有那些功能,实在有点捉襟见肘了,不得已,A君 只能重新考量下BeanFactory

BeanFactory

    按照 Spring 的设计理念,每个接口往往相互独立,尤其是顶级接口,功能是最通用的。也就是所谓的 接口单一原则 嘛。BeanFactory同样也不例外,Spring 同样让他保留最通用的功能,像是什么根据名称获取Bean、根据类型获取Bean、获取别名之类的功能都归到BeanFactory中。代码如下:

在这里插入图片描述

HierarchicalBeanFactory

    不知怎么滴,现在的框架都喜欢设计父子结构。JVM 有双亲委派、Tomcat 各个组件之间也存在层级关系。Spring 呢,也不例外,同样存在着层级结构。记得老早之前,那会儿还没有 SpringBootA君 很苦逼的用着 SSM时,遇到过一个问题:父子容器。当初可把 A君 折腾坏了,现在回头看,其实问题也很简单,无非就是 SpringSpringMVC 形成了两个容器,而 Spring 的访问机制是从当前容器逐层往上找,也就是意味着父容器不知道子容器中的注册的Bean,从而形成父子容器的问题。而造成这一切的‘罪魁祸首’,就是——HierarchicalBeanFactory。要想形成层级结构,要么当前对象包含子容器,要么就是包含父容器。联想到 Spring 先子后父查找Bean的方式,那么自然就是保存父容器的引用了。代码如下:

在这里插入图片描述

ConfigurableBeanFactory

    在前面的章节中,A君 总是时不时提到什么编程式,声明式。相信大伙儿耳朵都快听出茧子来了。不过,这里 A君 还是要啰嗦了下。简单的说:编程式就是可以通过写代码实现,而声明式则是通过配置来实现。这么说来,声明式似乎完爆编程式,正经人谁去写代码实现功能。话是这样没错,但是也不排除有些情况下,配置比代码更加麻烦,而且写代码也有写代码的好处,那就是灵活。废了这么多话,一句话概括,就是既要还要。主体还是用声明式,但是编程式也保留,用户自己决定怎么用。啥声明式、编程式的,把人整的一愣一愣的。作为开发,这关心代码怎么写。说穿了,也没啥,就是一堆set方法。ConfigurableBeanFactory代码如下:

在这里插入图片描述

AbstractBeanFactory

    已经定义了这么多个接口,也到了提取抽象类的时候了。这里就不在展开说明,怎么创建Bean对象,在前面相关的章节已经有详细说明了,Spring 本身的创建流程也差不多,只是提供了更多的功能。主体内容大差不差

在这里插入图片描述

AutowireCapableBeanFactory

    上面提到的功能基本已经满足常见的场景,只是少了一捏捏拓展,试想一下,有个Bean不只是创建出来那么简单,还是对对其进行初始化,用户不想,或者说是不能构造器初始化,这时候要怎么办?又比如用户想在Bean创建前后进行一些处理,这时候又要怎么办?一个优秀的框架既要满足大部分场景,又得留下足够的拓展,以便用户进行定制化开发。当然,这些功能会提供另外的接口,不会由AutowireCapableBeanFactory来处理,AutowireCapableBeanFactory要处理的事情是把这些方法规定出来,告诉实现者,有对应的初始化方法、前后置事件需要执行。这样设计初衷是为了增强灵活性,允许开发者在特定场景下对现有的非 Spring 管理的对象进行依赖注入、初始化以及生命周期管理。​这对于需要将第三方组件或已有实例集成到 Spring 容器中的情况尤为有用。知道了AutowireCapableBeanFactory作用,再来看下对应的代码吧,如下:

在这里插入图片描述

AbstractAutowireCapableBeanFactory

    接着,还是老样子,可以提取抽象类了,这个抽象类以前没见过,不过看接口也能大致猜出来就是些自动设置属性的活,来看看代码验证下吧。

在这里插入图片描述

在这里插入图片描述

ListableBeanFactory

    除了上述说到的功能,还缺少一个很重要的功能。那就是可列举的。啥?太术语化了?用人话说:就是可以获取容器中所有的信息,这返回值要么就是数组,要么就是链表。肯定是个集合,可以遍历,故而称为可列举的。这个功能重要性应该不言而喻,很多时候需要根据一些条件去容器中查找对应的Bean,像包含某些注解、是否是某个类的子类等。代码如下:

在这里插入图片描述

ConfigurableListableBeanFactory

    经过了层层加码,现有的功能已经足够强大了,剩下要做就是把这些功能整合到一个接口中去,在锦上添花,加点辅助性的功能就行了。这么说来,ConfigurableListableBeanFactory接口就注定不会有很多代码了,如下:

在这里插入图片描述

DefaultListableBeanFactory

    最后一步就是具体实现了,这个也不展开细说了,也和之前的差不多,就不多赘述了,最后再来看下整个BeanFactory的类图:

在这里插入图片描述

总的来说,Spring 都会把各个功能拆的很细,基本上都会提取出一个接口出来,而后又遵循 接口单一原则 拆分成很多小接口,最后又合成一个总接口。可能这就是 Spring 源码劝退萌新程序员的根源吧


总结

    正所谓树欲静而风不止,欲知后事如何,请看下回分解(✪ω✪)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穷儒公羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值