为什么要学spring源码
为什么要学spring源码?相信很多人心里有过这样的疑惑,甚至还有读者说他在工作中用的都是springboot从来没用过spring这样的笑话。实际上,对于JAVA程序员,我们的工作开展基本不可能离开spring。
学习spring源码有不少好处:
- spring的框架涵盖大量经典的设计模式,在阅读的过程中可以吸取优秀的编程思想,提高我们的编码素养,设计能力。
- 在工作中经常需要封装一些公共SDK组件,沉淀一些通用方法,这也是一个程序员进阶的体现。这时候基本离不开和spring底层框架打交道。通过阅读源码能直接提升工作中问题排查的思路,和解决问题的能力。
- 说个功利点的角度,面试的时候面试官都会问你,最近有阅读哪些源码。而spring源码,正是程序员之间惺惺相惜的一个最好的引子。
我是怎么学的
spring源码高达70w行,而我们只需要专注核心的功能实现即可。我会在之后的文章告诉大家,哪些是重点,而哪些只需要了解即可。学习的过程中需要保持不求甚解的心态。
踩坑之路
记忆中,断断续续学过spring源码3次,每一次的收获都不一样。就像以前每次碰到vn周免我都会尝试去玩一玩,但是总玩不好。等我500场后,都不需要刻意练习,我就能用vn大杀四方。
不同的阶段,学习和理解能力是不同的。我们千万别急躁的非要去深究我们不懂的部分,也许几个月后,再来回顾,结果会让你惊讶
第一次学习spring源码,那时候我还没毕业,才学到javase,但我早就听说了spring的大名。那晚我到图书馆拿了一本spring书籍就阅读了起来,但仅仅不到一个小时,我就选择了放弃这本晦涩难懂的书。那晚,我只记住了ioc和控制反转这两个关键词。
第二次学习spring源码,是在我工作了一年后。对spring的使用已经有了一定的经验,当时兴致勃勃的准备开始阅读,结果发现spring中有大量优秀的设计模式,虽然我能很艰难的看懂一些,但是感觉是对源码和时间的糟蹋。于是我花了两周先去学了设计模式。当我再回过头来看源码,那些优秀的设计模式,竟然直接能够给我启发性的思考,像是达到了颅内高潮,竟然能有这么巧妙的设计。以至于在后面的面试中,我能经常和面试官提起spring中优秀的设计模式。但是对于spring bean的实例化流程,以及大量的生命周期钩子函数,我还是一知半解。错综复杂的类和继承、组合关系,让我望而却步。
第三次学习spring源码,是在我工作了三年。工作中用过了大量的生命周期钩子函数,为了写底层SDK,查阅了不少资料,也吃了不少不了解sping的亏。当我再次学习spring,我发现我悟了,那些错综复杂的关系,我竟然能很快理出来,还开始用笔记去整合,去分类的记录相应的重要知识点。我知道,学spring的最佳时刻已经到来。就是现在!
学习路线
在阅读spring源码前,你需要确认你已经在工作中遇到了大量与spring打交道的场景,对spring的背景,能做的事都有个大致的了解。另外,你需要先掌握Gof 23种设计模式(看我之前的设计模式文章)带着这些欣赏美的能力去阅读源码,你能有更多的收获。
资料推荐
在朋友的安利后,我先在github上看了一个tiny-spring的项目,这个项目用了10个工程,从0到1的用最小单元的方式搭建了spring的核心功能,这样我们可以更专注功能的实现逻辑,而不会被其他无关代码所影响
tiny-spring是为了学习Spring的而开发的,可以认为是一个Spring的精简版。Spring的代码很多,层次复杂,阅读起来费劲。我尝试从使用功能的角度出发,参考Spring的实现,一步一步构建,最终完成一个精简版的Spring。有人把程序员与画家做比较,画家有门基本功叫临摹,tiny-spring可以算是一个程序的临摹版本-从自己的需求出发,进行程序设计,同时对著名项目进行参考。
学spring,当然得知道spring有哪些功能,再根据功能去查看实现的源码。针对spring的功能这一块,我看的是B站雷丰阳spring 雷神的名号大家有目共睹,把我们常用了spring功能都说的非常详细,其中还附带了一些源码讲解
工欲善其事,必先利其器。学习spring源码,当然要构造一个源码阅读的环境。我们可以直接用maven引入spring。也可以去下载中文的源码包,这样自己也能进行一些额外的注释和源码改动。但是源码是gradle环境,构建起来可能会比较复杂,大家量力而行
当然这些仅仅是刚刚开始,想阅读源码,我还参考了不少的视频。其中一些很不错的视频
- 咕泡学院的spring源码章节
- 鲁班学院子路老师的spring源码
- 极客时间小马哥的spring系列课程(200多节非常详细)
内容概览
一个bean的生成包括了大量的步骤,而我的文章应该也会围绕这些步骤当中的每个核心,去展开说明吧。
- 🔲BeanDefinition的定义元信息的解析(xml,properties,java注解)
- 🔲Bean IOC的生命周期及钩子函数
- 🔲BeanFactory和ApplicationContext的区别
- 🔲Spring AOP的全流程
- 🔲后续的等我学到,持续更新。。。