笔者在阅读spring源码的时候也是借助了很多相关资料。如果你看过spring的话,你就会明白,spring的源码不复杂,复杂的是spring的思想和设计模式,很多时候源码看着看着,就不知道走到哪里去了。spring中使用了大量的设计模式,以至于spring的继承,实现,父子类关系变的相当复杂,所以在此谈一谈几点关于怎么阅读的心得。
心得源码阅读要找入口
我们看spring的源码,最首要的任务就是要搞清楚入口在哪里,这样我们才知道从哪里开始看,spring有很多入口,但是我们可以从例如以下入口开始看
我们知道这是手动加载XML进行读取的方式。通过这里,我们就可以加个断点,然后对spring进行调试
警惕阅读细枝末节
在spring中可能A方法有BCDEFG六个方法,而B方法中又有HIJKLM留个方法,然后H中又有N个方法,如果我们循着B方法里面去看你会发现翻到最里面你已经忘记了你要干嘛了,对于这种细枝末节过多的方法,我们一定要警惕,建议是先把A方法中的BCDEFG六个方法看懂。这跟我们玩游戏做任务是一样的,也就是说先把主线做了,再去做支线。
一定要连蒙带猜
前面说我们在阅读的时候先要把主线读懂,那么如何能够在不细读支线代码的时候能搞清楚主线的流程呢?有个很重要的方法就是连蒙带猜,在spring中,无论是变量还是方法的命名都是很规范的,也就是说,我们通过一个方法的名字,就基本能猜出这个方法在干嘛。例如refreshBeanFactory
很明显能猜出来是刷新Bean工厂,getBeanFactory
是获取Bean工厂
另一个思想就是假想,也就是说,你要去想,如果让你来设计这个东西你会怎么设计?比如说让我们来设计一个IOC容器,你会怎么设计呢?我们首先就要想,既然是容器,那么Java里面的容器有哪些呢?List?数组?Map?Set?,我们知道,注入的时候是通过Bean的名字或者类型id等来注册的,那么通过把Bean的标识作为一个key,Bean本身作为一个value的Map来实现这个IOC容器是不是很合理呢?
然后我们又猜想这个Bean是怎么放到IOC中的呢?我们知道我们的Bean是配置XML中,那么IOC是不是解析了这个XML然后得到我们配置的东西呢?怎么解析的呢?DOM4J或者是DOM或者是其他什么方式呢?我们就可以通过这些猜想,大概想清楚spring中是怎么进行这些动作的,然后我们再去看源码以验证我们的思想。
事实上,spring中的IOC容器确实是通过一个Map来实现的。这点后续会介绍。