Spring 源码的阅读心得

 2023-02-02
原文作者:Pseudocode 原文地址:https://juejin.cn/post/7175904028230942778

最近花了很多时间去阅读Spring框架核心部分的源码,本文将分享一些阅读的思路和心得,分享给想阅读源码但是不知道如何下手或者读不下来的小伙伴。

为什么要读 Spring 的源码?

Spring 是 Java 开发者最常接触到的框架,也是最优秀的框架之一,Spring 的源码质量也是开源框架中的佼佼者。一个程序员想要让自己的开发水平得到提升,阅读源码是必不可少的,但是大部分人日常工作中能够接触到的代码有限,如果你只是在日常的工作中阅读同事的代码,那能学到的东西是非常有限的。一来,工作中能接触到的同事的能力上限,跟全世界顶尖程序员的能力上限相比,差距是非常大的;再者,工作中的场景,经常被工期等非技术因素影响,并不能完全把开发者的技术水平体现出来。

因此,众多的优秀开源项目,就是一座巨大的知识宝库。读一本书,是与书籍的作者交流,而读一个开源项目的代码,则是与项目的开发者交流,而且这些开发者,往往是特定领域中非常顶尖的开发者。通过他们的源码,能够读到书本中学不到的知识和经验,更重要的是他们的巧思。

另外,阅读代码是一个程序员的基本功课,阅读并理解代码的能力,对一个开发者来说非常重要,这个能力需要不断地通过练习来提高。如果能花在阅读代码这件事上的时间是固定的,那么,阅读怎样的代码,决定了这些时间的所获的的收益。阅读一些通篇都是条件判断和循环语句的代码能收获的极其有限,而阅读优秀开源项目的代码则会非常解渴。

阅读代码带给我的收获就是,更加宏观地思考整个项目的架构,以及从需要解决的问题中分析出抽象层次更高的解决方案。

阅读代码的收获

阅读代码还能收获什么呢?

如果你认真学习了各种设计模式,但是不知道如何应用,那么你能从诸如 Spring 这样的项目中,遇到各种优秀设计模式的最佳使用场景和实践;你还会从项目的整体架构中,学会组织代码的方法,或者一些架构的思维;另外,还可能有一些意外收获。

阅读的方法

当拿到一个开源项目代码的时候,应该如何开始呢?下面以 Spring 为例,分享一下我的心得

如何开始

对于 Spring 而言,在开始阅读源码之前,至少在框架的运用层面,需要对它有一定的了解。Spring 最核心的特性就是 IOC 容器,在基于 Spring 开发项目时,我们与框架交互做多的两件事,就是对容器进行配置,以及从容器中获取一个 Bean 实例,因此可以从这两方面入手。

对于容器的配置,主要是在容器启动时发挥作用。你可以从 ClassPathXmlApplicationContext 类的构造方法开始,分析 Spring 如何基于 XML 配置文件,来创建全新的 Spring 上下文实例,或者,从 AnnotationConfigApplicationContext 的构造方法开始分析 Spring 如何基于给定包路径下的组件扫描来创建上下文实例。Spring 上下文的启动过程,其实就是创建上下文对象的过程,相对于只是基于框架做应用开发而言,通过了解这一过程,可以对 Spring 的 IOC 容器的理解深入好几个层次。

另一个主要的逻辑线就是从容器中获取 Bean 实例,这条主线从 BeanFactory 的getBean方法开始,分析完这个过程,就了解了 Spring 如何从你的需求,根据容器中的 BeanDefinition 创建出一个 Bean 实例的过程。

除了 IOC 以外,Spring 中另外一个重要特性 AOP 则是基于 IOC 容器的扩展,具体是通过 BeanPostProcessor 实现,如果你通过源码熟悉了 AOP 的底层原理,那么事务管理等基于 AOP 来实现的特性,也就非常容易理解了。

紧贴主线

由于 Spring 已经发展成了一个功能非常完善的框架,因此代码量巨大,组件与组件之间的关系错综复杂,因此,在阅读源码的时候,非常容易迷失,陷入到无尽的分支逻辑中。因此,我的建议是,一开始,只考虑最主要的主线逻辑,不考虑细枝末节,这样能够让思路保持在主线中。

比如,分析基于 XML 配置文件的 Spring 上下文的创建,你可以先写一个最简单的 XML 配置文件,在阅读源码的过程中,只对这个配置文件会执行的流程做分析,这样,可以一条主线把创建上下文实例的逻辑走完,等到对它非常熟悉的时候,再去考虑多的细枝末节。

及时总结

由于 Spring 代码量巨大,涉及到的逻辑线也非常多,经常容易看完后面的,忘记前面的,因此,要记得看完一部分及时总结。总结可以是一个流程图、一篇文章,或者任何你认为合适的方式,一来可以加深记忆,二来可以复习和会刊。

记得分享

另外,如果能把自己的收获分享给别人,无论对别人还是自己,都是一个非常好的学习的方式。


本文正在参加「金石计划 . 瓜分6万现金大奖」