框架源码系列五:学习源码的方法(学习源码的目的、 学习源码的方法、Eclipse里面查看源码的经常使用快捷键和方法)

一. 学习源码的目的

  1. 为了扩展和调优:掌握框架的工做流程和原理编程

  2. 为了提高本身的编程技能:学习他人的设计思想、编程技巧app

二. 学习源码的方法

方法一:框架

  1)掌握研究的对象和研究对象的核心概念:搞明白框架都能作什么,是怎么作的。eclipse

    好比咱们要研究Spring的源码,那么研究的对象就是Spring,Spring的核心概念有IOC、DI、AOP等,那么咱们就须要搞明白这些核心概念能作什么,是怎么作的maven

  2)从总体到部分ide

    首先要弄清楚总体是由哪些部分组成起来工做的,而后再去研究各个部分是怎么作的。好比咱们如今研究Spring IOC,就要先弄清楚IOC由建立bean定义、注册bean定义、bean工厂几部分组合起来工做的,而后再去研究这几个部分是怎么作的函数

  3)找到入口,先理清楚主干流程,而后再去研究各个流程的细节学习

    好比咱们要研究Spring是怎么加载xml配置文件去建立实例的,那么咱们就须要找到入口,从入口进去之后先不要急着看具体的实现细节,要先理清楚主方法里面大概作了哪些事,而后再去看各个方法是怎么作的测试

  4)多折腾、勤折腾this

    研究完源码之后,知道源码能作什么、是怎么作的了,那么就能够写一些代码去测试他是否是确实能作到。或者知道源码有一些扩展点,就本身尝试去扩展一下

方法二:

  1)掌握研究的对象和研究对象的核心概念:搞明白框架都能作什么,是怎么作的。

    好比咱们要研究Spring的源码,那么研究的对象就是Spring,Spring的核心概念有IOC、DI、AOP等,那么咱们就须要搞明白这些核心概念能作什么,是怎么作的

  2)本身动手尝试去实现。 

  3)本身实现完之后,再去对比看源码里面是怎么实现的,源码里面为何要那样去实现,有什么好处,学习源码里面好的地方

前面的两种方法,我的比较推荐方法一,由于每一个人的水平不同,方法一相对方法二来讲要简单一点

前面已经介绍了两种学习源码的方法,那么怎么深刻到源码里面去看别人是怎么作、选择性的去看某一部分源码是怎么作的呢?针对不一样的状况,有下面的方法:

第一种方式:

  刚刚接触到一个新框架,彻底不知道源码是干什么的,这种状况就得找到官方文档里面的使用示例找到入口,而后一步一步的去调试拿到整个调用栈,拿到整个调用栈之后就知道主干流程了,再去分析本身感兴趣的部分是怎么实现的就比较简单了(比较费时

第二种方式:

通过 学习源码的方法的方法一中的第 1)步 分析,知道源码里面要作某一件事,那就找到官方文档里面的使用示例找到入口,而后找到作某一件事的地方,打个断点,直接debug到作这件事地方拿到调用栈去分析,看都通过了哪些处理,而后去分析本身感兴趣的部分是怎么实现的。

好比IOC容器加载配置文件建立bean实例时必定会有注册bean定义的步骤,那么咱们就先根据类的继承体系找到注册bean定义的类和对应的方法的实现的地方,在里面打个断点,直接debug到注册的方法的断点的地方时就能获取到调用栈了,而后再根据调用栈分析Spring要完成根据xml配置建立bean实例都有哪些类参与进来。

下面就来举例说明:

首先从官方文档能够得出以下使用示例:

官方文档:

使用示例:

ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");

而后进入ClassPathXmlApplicationContext里面

 

咱们知道IOC容器的工做过程是加载xml、解析xml获得bean定义、把bean定义注册到bean工厂里面、bean工厂根据bean定义建立bean实例,那么咱们就根据ClassPathXmlApplicationContext的继承体系先找到哪一个类里面持有bean工厂,找到持有bean工厂的地方之后先看有没有注册bean定义相关的方法,根据继承体系寻找,最终发如今父类AbstractRefreshableApplicationContext里面持有Bean工厂DefaultListableBeanFactory:

    /** Bean factory for this context. */
    @Nullable
    private DefaultListableBeanFactory beanFactory;

 经过在AbstractRefreshableApplicationContext里面查找,没有找到注册bean定义相关的方法,那么咱们就看DefaultListableBeanFactory的里面有没有注册bean定义相关的方法,最终发现DefaultListableBeanFactory里面果真有注册bean定义的方法registerBeanDefinition

    @Override
    public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
            throws BeanDefinitionStoreException {

 经过查看DefaultListableBeanFactory继承体系,咱们能够看到DefaultListableBeanFactory实现了BeanDefinitionRegistry这个接口来实现bean定义注册

那么咱们就在registerBeanDefinition(String beanName, BeanDefinition beanDefinition)方法里面打个断点,而后debug运行前面的示例代码到这里:

到这里咱们就能拿到整个调用栈了:

拿到调用栈之后,咱们就能够来分析Spring是怎么加载xml、解析xml获取bean定义、注册bean定义到bean工厂的了

那么怎么来具体分析调用栈呢?

主要看调用栈(看从开始到注册bean定义这件事情)用到了哪些类的哪些方法,看传参。工做是如何分配、分工协做完成的。
看传参重点是看输入的参数(如xml配置文件的路径)在这些类中是怎么变化的(代码的本质其实就是对输入数据的各类处理获得最终想要的结果),从而知道每个类是干什么用的。分析完整个调用栈之后,想要了解哪一部分就点击对应的调用栈去分析就好了。

从调用栈能够看到要加载xml、解析xml获取bean定义、注册bean定义到bean工厂这些事须要三个类依次参与进来:

说明:

方法里面含有<init>的表示是在构造函数进行初始化,方法里面带有(AbstractApplicationContext).refresh()的表示调用的是AbstractApplicationContext父类的refresh()方法,其余的相似

1)ClassPathXmlApplicationContext:初始化、准备BeanFactory

2)XmlBeanDefinitionReader:输入的xml配置文件路径的字符串到Document的转换

3)DefaultBeanDefinitionDocumentReader 解析Document获得bean定义持有器BeanDefinitionholder

4) 后面的步骤就是把BeanDefinitionholder里面的Bean定义注册到Bean工厂里面

3、Eclipse里面查看源码的经常使用快捷键和方法

前提:在eclipse里面导入了源码或者用maven引入了源码的依赖

1. 查找源码的类的快捷键 

  Ctrl+Shift+T 而后输入要看的类

 

2. 查看一个类继承了哪些类的以及有哪些子类

 选中要查看的类,右键-选择Open Type Hierarchy(打开类的继承体系)

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory,HierarchicalBeanFactory,MessageSource,ApplicationEventPublisher, ResourcePatternResolver

 查看继承了哪些类:

 

 

查看有哪些子类:

 

选中部分里面对应的成员:

 

3. 查看一个类都有哪些子类

  选择要看的类 而后Ctrl+T

 

相关文章
相关标签/搜索