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源码阅读目录
- 第一部分——IOC篇
- 第二部分——AOP篇
- 前言
- Joinpoint(连接点)
- Pointcut(切点)
- Advice(通知)
- Aspect(切面)
- Weaver(织入器)
- Target Object(目标对象)
- 融入IOC容器
- 总结
前言
对于Spring一直都是既熟悉又陌生,说对它熟悉吧,平时用用没啥问题,但面试的时候被问的一脸懵逼,就很尴尬,都不好意思在简历上写着熟悉Spring了
所以决定花点时间研究研究Spring的源码。主要参考的书籍是:《Spring源码深度解析(第2版)》、《Spring揭秘》、《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》
前边 A君 把 AOP 集成到了 IOC容器 中,Spring 中最基础,也是最重要的两部分内容都整完了。不知道对大家是否有所帮助?不过,这 AOP 部分,A君 换了个写法,之前在写 IOC 篇章的时候,A君 站在完全站在开发者的角度上,去考虑抽象、拓展。而 AOP 篇章,基本上是以 Spring 的视角开展的,一来是怕自己理解有所偏差,胡说八道,误人子弟就不好了,二来也是希望对 AOP 部分有更深入的理解。但这也造成一个问题,这篇文章是否有存在的必要。按理说,能读懂前面 AOP 相关章节,再去看 Spring ,应该是无压力的,这篇文章就没有任何意义了。思来想去,A君 还是决定写下这篇文章,权当折腾这么久的劳动成果吧,也算是对 AOP 进行一个总结
在研究 AOP 的过程中,A君 曾多次被 Spring 的设计、代码惊艳到了,Spring 能出圈,受到大家的追捧不是没有原因的。好了,废话不多说了,开始我们的源码之旅吧,具体实现、细节部分前面相关章节已经说过,这篇就不重复水字数了,这里让我们把重点放在 UML 图上,了解下 Spring 的设计。
Joinpoint(连接点)
让我们回到梦开始的地方,从 Joinpoint(连接点) 入手把,其 类图 如下:
关于 AOP 部分,Spring 也遵循 AOP联盟 规范,大体上,都是在其的基础上做拓展。Joinpoint(连接点) 一如既往的简单,比起一堆抽象类,实现类。Joinpoint(连接点) 简直就是梦中情类,出淤泥而不染。就一个实现类,当然,也有些内部类,这里不在讨论之列。之所以这么简单,主要 Joinpoint(连接点) 也确实没有啥,主要用于保存目标对象、目标方法、已经方法参数,还有个就是负责整个调用链的执行,其他就没它什么事了。啥?你说增强方法有可能用到。不,也用不到,那个用的是 AspectJ 的,一直都是 AspectJ 默默的抗下了所有。这里的 Joinpoint 接口,主要用于 Spring 内部使用
Pointcut(切点)
紧接着出场的是 Pointcut(切点),它的 类图 如下:
哇,看这种就头疼,是不是瞬即觉得 Joinpoint(连接点) 眉清目秀了起来。其实,其他用的并不多, 自从有了 AspectJ 后,Spring 也开始‘摆烂’了,全面拥抱 AspectJ,其他实现应该都是之前没有 AspectJ 时候过的苦日子。现在重点关注 ExpressionPointcut 这条线就行了,只有一条线,Pointcut(切点) 也开始眉清目秀起来了
Advice(通知)
接下来,有请下一位选手 Advice(通知)。类图 如下:
Advice(通知) 这位选手更加不友好了,都快成蜘蛛网了。至于为什么会这样,已经在 第十九章 Spring之假如让你来写AOP——番外篇:Spring早期设计 中详细讨论过了。这里就简单的说下吧,其实把 Advice(通知) 分为两个阶段来理解就简单了,这两个阶段分别是:有 AspectJ 前,有 AspectJ 后。首先是第一阶段,那时候没有 AspectJ,早期的 AOP 就比较简单,由 Spring 提供对应的增强接口,用户去实现,再由 Spring 进行对应的转换
早期就分为两部分,一部分以 Advice 为核心的通知接口,另一部分以 MethodInterceptor 为核心的转换实现,大体如下:
后面有了 AspectJ 后,事情开始变得复杂起来了,首先 AspectJ 提供了很多强大的功能,意味着有更多的通知可以实现,一方面还得给 AspectJ 提供公共实现,还得对老接口的兼容,都统一用 AspectJ 实现。大体如下:
Aspect(切面)
告别了上一位令人头疼的 Advice(通知),我们引来新的选手——Aspect(切面),这次还是个双子星。我们先来看下 Advisor。类图 如下:
这个就是典型的 Spring 设计了,基本上和 Pointcut 对应,因为它就是用来管理 Advice(通知) 和 Pointcut(切点) 的
接着是 Advised,类图 如下:
Advised 也很明了,没啥好说的,它主要是用以管理 Advisor的
Weaver(织入器)
好的,有请下一位选手——Weaver(织入器) 。类图 如下:
Weaver(织入器) 的功能就是创建代理对象,并且把切面织入到代理中去。目前就两种实现:接口代理、类代理。那简单也是可以理解的
Target Object(目标对象)
接着是 AOP 最后一个选手——Target Object(目标对象),类图 如下:
这部分内容并不是 AOP联盟 的规定,是 Spring 自己的实现。看它的实现也能明白,是为了支持不同的作用域设计的
融入IOC容器
还有一个特别嘉宾——AspectJAwareAdvisorAutoProxyCreator。类图 如下:
AspectJAwareAdvisorAutoProxyCreator 主要的作用就是把 AOP组件 融入到 IOC 中,用户只要配置就行了,不需要关心具体实现,这也是方面用户使用
总结
之前一直想对 Spring 进行研究,一直不得空,现在总算把 AOP 部分过了一遍,所幸结果还是让人欣喜地