断点怎样不进入源码_如何阅读优秀的源码(心得)

83158334ea0204255fea07631fd588d7.png

## 如何阅读优秀的源码(心得)

  在上学那会呢,就挺感兴趣对阅读源码,为什么呢? 作为一名程序员,也想写出跟比尔呢一样牛的代码,为人所用啊。我也想变得优秀。 但是那会真是有心无力啊,基础没有,经验没有,对编程的认知低,领悟能力差。连个增删改都不能很清晰的写出来。还阅读源码呢,这就是寸步难行啊。没有办法,放弃! 继续积累经验,继续打好基础。

也是因为好奇心。 看看别人看似上手简单的框架 比如Spring,Mybatis。上手容易,但是它的内脏千丝万缕,却又层层递进,相互依赖,又互不影响各司其职。这是如何操作运转的呢? 十万个为什么? **你知道Myatis是基于jdbc的封装,但是你知道他是怎么封装的吗?你知道JDBC的查询结果就是一个Result对象,而mybatis却可以根据你写的的返回结果对象做好封装,这又是怎么封装的呢,获取你说得出来,当然这是利用反射啊,但是你知道怎么个反射法吗?;你知道Mapper是一个接口为什么可以@Autowired 注入吗? 或许你知道他是代理啊,当然是代理,但是你知道他怎么代理吗,怎么巧妙的设计吗?源码中有很多值得我这样的小白学学习的地方**....

于是最近攒点了经验,有了点小基础了,所以看了遍基于SpringBoot去看的mybatis源码。 并且跟着 mybatis 的源码,写了一个超级 mybatis,我为什么叫超级mybatis?这个是相对别人的mini版 取的名字。 我的更贴近源码,更能体会源码的设计感受,让你又一种身临其境的感受。

(绝对原创哦) 超级Mybatis源码地址:

https://github.com/lyj08/super-mybatis.git

还附赠一个 根据实体类生成表的 starter

https://github.com/lyj08/forward-generation-starter.git

c20b0ef40f72447712fd40c188c2910d.png

看似千丝万缕的代码,只要找到切入点,就可以捋好他们的之间的依赖关系

阅读源码

一、工欲善其事必先利其器

熟悉一款开发工具,并且熟练的掌握调试功能,比如说IDEA

调试代码快捷键:windows

  shift + F9  debugger运行
  Alt+F10   显示执行断点
  F8   执行下一行代码
  F7   进入代码快
  F9   放开断点,进入下一个断点
  alt+shift+F7  强制进入代码  
  Shift+F8 跳出函数
  alt+F8 查看值 

  // 查看类的继承关系图 快捷键
  ctrl+alt+u   
  alt 7 查看类中的方法

二、冰心老师说:先把书读厚,再把输读薄,再读后

阅读源码之前,先了解 源码的核心模块,不同模块之间的关系,大方面的知道。这就是把书读厚;然后再找切入点。深挖他们模块之间的协调运作,捋清楚他们的关系(把书读薄),接下来总结、归纳 (把书读薄)。这个时候你之前所了解的大方面架构思路,就会再你脑中有印象了。不再只是知道只能说出来书面语而已了。在你跟别人讲解的时候你脑海中会进入到源码中去的,因为有依据。

例如

这时也可以这么分析mybatis

宏观角度

  将mybatis 的一个查询过程分两部

1. 去的过程

- 去我只的是,项目启动的时候,mybatis做了什么?

1.Bean工厂实例话; 2.xml解析; 3.mapper扫描 (还可以更细)

2. 回的过程

- 回:我指的是,在发起一个查询命令的时候MyBatis又做了什么?

- 怎么根据mapper Id 找到对应的处理方法的? .....

例如: Mybatis中的 mapper 是怎么能够 @Autowired 注入的呢?

看源码之前:你可能会说:‘肯定是jdk动态代理啊!’ 如果你没有查看过源码?你说这句话的时候可能是没有灵魂的,只是知道它的表面书语。

这个时候你如果阅读过源码,在你回答的时候你就会想到源码中去了,他是怎么代理的呢?哦原来是 利用 Spring 中的 ImportBeanDefinitionRegistrar.class 类中的 doScan() 方法 去做的扫描,并且重写扫描规则的方法registerDefaultFilters(),实现自己的扫描规则,然后对扫描结果的 BeanDefinitionHolder 里面的BeanDefinition 的beanClass 属性进行操作改变。 扫描结果出来的 beanClass 是 Mapper的class,如果不做改变,在实例话的时候就会报错了,因为没有实现类。oh my gad! 到这里的时候,你有没有以为,是直接生成代理类丢到Spring中的啊,不 不是这样的。

这个时候 你知道 FactoryBean.class 吗? 刚刚提到到修改 BeanClass属性,就是修改为 MapperBeanFactory.class 的class。MapperBeanFactory实现了FactoryBean ,里面的getObject() 方法才是 生成的代理对象哦。 在实例话的时候, Spring会判断是不是 BeanFactory 如果是的话就会调用 getObject() 方法获得一个实例,这个时候就不会报错了把。 但是真正生成的代理类并不是在这个方法里哦,还要转好几层方法呢,最中是一个代理工厂**MapperProxyFactory** 生成的代理对象哦。如果想听我将故事,接下来我会根据自己的心得体会,去将一下mybatis源码解析。

这个时候是不是已经替换了BeanDefinition,beanClass 属性了,然后doScan 完成之后Spring开始初始化所有的单例Bean 了,因为Spring 中有两种Bean ,一种 就是 FactoryBean,一种是普通Bean ,如果是FactoryBean 就是直接调用 getObject方法 拿到实例哦。 然后放到Map中,然后就是依赖注入的环节了。 这是已经生成了代理对象实例了,@Autowired 注入 还会空指针吗?当然不会了。 这不就完成了一个过程了吗? so easy 吧!

**这个时候 你在说一遍 这个 mapper是怎么通过@Autowired 注入的 这时候 你脑子是不是就会走一遍我上面说的过程,清晰明了,这个时候的回答,是不是有灵魂的回答啊,比之前的书面语是不是更有底气,在面试的时候啊**

三、好记性不如烂笔头

在学习源码的时候,刚断点进入第一个类,一点类中的方法,呲溜一下,又跑另外一个类去了,而且这个类还不在当前的包中,这样子跳来跳去,记不清楚哪个类跟哪个类又关系了,这个时候就先 ctrl+alt+u 先看看 继承关系 以及 alt+7 看看类中的方法,做好笔记,先是哪一个类的方法->再到哪一个类的方法->不管它深入多少层,记下来了后,多跑几遍,画个关系如,这不就捋清了某一个功能的类之间的关系了吗,千丝万缕的关系,是怎么协调运作的不就清楚了一步了吗?

四、跟着源码写一个超级版本的出来

如果源码不是很大,可以跟着源码手写一个出来,这样子会更有收货,不需要又多还原代码,只要核心思想到位即可。

五、找准切入点

要看源码的哪个功能,就找准切入点。

比如说基于SpringBoot 的Mybatis, 怎么找到切入点啊。

我就找到启动类上的 MapperScan注解,点火线就在这

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值