断断续续看sping源码也有两三个月了,最开始只是想找一些面经,背题,把相关的概念背下来,但后面发现背的越多,不懂的就越多,更心虚了,想想还是要下定决心来啃一啃,走了很多弯路,把自己的经验记录一下,学习一直在路上,码不停蹄,继续前行。
动手
纸上得来终觉浅,绝知此事要躬行。
一定要动手,亲自动手搭建一个源码阅读环境,一个是可以方便自己做注释,而来可以自己写测试案例,来一步一步debug。
可以看帖子,可以看视频教程,可以阅读相关书籍,但具体的实操还是不能少,只停留在记忆的层面,犹如过眼云烟。
为什么要强调需要有一个能跑起来的阅读环境呢?因为spring源码太优秀了,里面到处是接口、抽象方法,如果你的代码不能跑起来,自己用鼠标去点,走着走着就会发现没路了。
最开始spring源码,无从下手,初学者甚至连入口在哪都找不到。
太多的类,太多的方法,无数的分支,就像一个迷宫一样,进去就出不来了。
如果不debug,只是F7点进去看,碰到接口了,具体调了那个实现类也不知道,导致寸步难行。
比如刚开始我是这样的
new ClassPathXmlApplicationContext()处点进去
public void test() throws Exception{
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-test.xml");
}
追到this
public ClassPathXmlApplicationContext(String configLocation) throws BeansException {
this(new String[] {configLocation}, true, null);
}
费了很大劲追到refresh()
public ClassPathXmlApplicationContext(
String[] configLocations, boolean refresh, ApplicationContext parent)
throws BeansException {
super(parent);
setConfigLocations(configLocations);
if (refresh) {
refresh();
}
}
又费了很大劲走到了obtainFreshBeanFactory()
本着有方法必点的精神,走到refreshBeanFactory()
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
refreshBeanFactory();
return getBeanFactory();
}
然后就傻眼了,没路了,这是一个抽象方法,自己并没有实现
该怎么找实现类呢?从其他帖子得知可以点左边的接口图标查看子类实现,此时出现了两个接口,黄色的森林里出现了两条路,我不能同时去涉足,迷茫了~
每一个都点一下?这才两个,有更多的怎么办?像这个,有34个
所以debug很重要,它会帮我们找到真正的实现类。
提纲挈领
前面提到,spring类太多,迷宫一般,一定要摒弃那种——见到方法就点进去——的习惯,抓大放小,先主干,在细枝末节。
比如这个doLoadBeanDefinitions里面的doLoadDocument,里面代码非常复杂,但我们知道它的功能就是把配置文件流转换成一个Document对象,而且这个过程与spring主干功能关系不大,因为最终调动的javax里面的方法,那就先把它当黑盒看待。
如何抓大放下,如何辨别大小,一个是跟着一个“名师”学习,一个是依靠自己经验的判断。
购买或者找一套完整的教程,跟着学,边学边动手验证,反复调试,主干流程熟悉了,再逐个探究细节。
比如最最最基本的主干流程,创建ioc容器——读取bena定义信息——创建对象
然后慢慢抠细节,容器创建前做了些什么工作,容器创建时做了些什么工作,逐步细化
善于用Variables
idea的调试窗口,关注variables的变化,你能捕捉到很多信息,比如哪个变量在什么时候变成了什么值
在spring流程中,最最最核心方法就是refresh()
BeanFactoryPostProcessors在哪添加的,什么时候实例化的,什么时候调用的?
明明自己只定义了两个类,为什么BeanDefinitionNames里面有8个值,其他六个哪来的,哪一步添加进来的,
然后在回过头去,一点一点把细节抠出来。
未完待续……