因为不断有朋友,或留言,或私信,问我Spring源码阅读问题。我本有心回答,但奈何这是一个非三言两语能说清楚的事。所以就决定写一篇小文,来分享下我的浅薄经验。
因为Spring的源代码量非常大。如果像阅读小说一样,一行不拉地读,是不现实的。所以,现实,而且有用的做法,是只阅读核心代码。
至于其他边支代码,如果通读,一则不现实,二则没有必要。
但因为Spring复杂,且设计精妙。初学者刚开始阅读,必然会面比较茫然,不知从哪里入手。而我的做法,有以下几个关键点:
1.先掌握Spring的基本用法。
在阅读Spring源码之前,首先要掌握Spring的基本用法,否则就找不到基本的出发点。
此时,你肯定不能完全理解Srping的运行机制。但随着使用的熟练,一则积累了经验,二则肯定也会有很多疑问。这不要紧,反而是好事。
随着学习的深入。你要有自己思考:如果某个机制(例如IOC),由你来设计,该会如何实现?
2.写几个典型的Spring Demo
因为你的目的是阅读Spring源码。所以如果一开始,就阅读相对高阶的SrpingMVC,需要理解的东西太多,必然会茫然不知所措。
因为起始难度太大,缺乏正反馈。对很多人,甚至是直接就吓退了。
所以,准备几个好的Demo,这些Demo一定要层层深入,从而作为自己阅读源码的出发点。
在内部培训中,我写过一个教程,名叫《Spring从入门到精通》,该教程总共包含5个Demo,由浅入深的顺序如下:
- 基本Java程序示例(SimpleJavaDemo)
- 基本Spring示例(SimpleSpringDemo)
- Spring自动织入示例(AutoWiredSpringDemo)
- Spring自动扫描示例(AutoScanSpringDemo)
- SpringMVC示例(SpringMVCDemo)
大家可以根据个人的情况,也编写出自己的Demo库。
3.边调试,边阅读
例如对下面这行最普通的Spring代码:
直接用Maven下载源码,然后在Eclipse中Debug进去。此时,就像你平时阅读同事的源码一样。带着疑问,带着猜测。阅读的过程,边验证,边调整,总重形成体系的思路。
记着,因为Spring源码复杂,且继承体系深,所以一定要边阅读,边记笔记,边画图。例如下面就是我画过的一个图(从Eclise中截取):
很重要的一点。在阅读Spring源码前,一定要先有自己的想法:如果这个东西(例如经典的getBean()方法)由你要设计,会怎么做。然后带着想法,跟(debug)进去。不断验证,不断调整。
4.不需面面俱到,只抓重点。
因为Spring源码巨大。对阅读者来说,也不是都有价值,所以一定要抓住重点。
要时刻记住阅读的初心:不是为了阅读而阅读,而是为了深刻理解Spring,从而自由运用,所谓“无真相不自由”。所以只阅读核心的,对自己有用的(这个因人而异)。下面是我当年阅读时的读书笔记提纲,贴出来供大家参考:
5.Spring阅读的收益
通过阅读Spring源码,至少能有以下收获:
#.精通Java
因为 Spirng框架本身,就是对Java最“精妙”的运用。我敢保证,在阅读Spring的过程,除了发现很多Java的“新”特性外。你也能学会“大神”们,是如何正确且高效的编写Java程序。
#.学习设计
Spring框架本身就是一个“设计良好”的典型,其中大量运用到经典的设计模式,例如“观察者模式”、“单例模式”等。因此学习Spring的过程,就是学习设计的过程。
#.深刻理解Spring用法
所谓“无真相自由”。等你学习了Spring源码后。我敢保证,你回头再来看自己,或别人原来写的Spring程序,肯定会发现诸多“错误”。包括代码的冗余,冲突等。
最后
如果你是一个初学者。刚开始阅读Spring源码,一定会感觉特别困难。因为其中涉及太多新东西。但这正说明,Spring源码是一个宝库。
咬咬牙,扛过去,你的技术层次就会跃上一个新的台阶,甚至是质的飞跃,所谓:
“会当凌绝顶,一览众山小。”
最后祝你好运,加油!!