0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

你想好入城了吗?告诉你我是怎么样读源码的

5RJg_mcuworld 来源:lp 2019-04-11 09:12 次阅读

刚参加工作那会,没想过去读源码,更没想过去改框架的源码;总想着别人的框架应该是完美的、万能的,应该不需要改;另外即使我改了源码,怎么样让我的改动生效了? 项目中引用的不还是没改的jar包吗。回想起来觉得那时候的想法确实挺......

工作了一年多之后准备跳槽了,开始了一轮的面试,其中有几个面试官就问到了相关的源码问题:ArrayList、HashMap的底层实现,spring、mybatis的相关源码。问源码的面试一般就是回去等消息,然后就没然后了。那时候开始意识到,源码这东西在之前的工作的中感受不到,但是在面试中好像面的还挺频繁的,从此有意识的开始了jdk部分源码的阅读(主要是集合)。一开始看源码,看的特别糙,知道个大概,知道ArrayList的底层实现是数组,HashMap的底层是散列表(数组+链表);更深入一点的扩容、hash碰撞等等就不知道了。

读spring源码起于工作中遇到了一个问题(spring jdbcTemplate事务,各种诡异,包你醍醐灌顶!),排查一段时间最终是解决了,但过程让我非常难受,各种上网查资料、各种尝试,感觉就像大海捞针一样,遥遥无期。我下定决心,我要看一看spring的源码,于是我买了一本《spring源码深度解析》,结合着这本书、打开着eclipse,开始了spring的源码阅读之旅。至此,读源码成了习惯,源码已经进入了我的心里。

后来,springboot的火热,让我也想蹭上一蹭,于是有了springboot的启动源码系列,虽然还在进行中,但是我相信我能将其完成;工作中用到了shiro,我又结合着《跟我学shiro》将shiro的源码看了个大概,有了shiro源码系列博文,还差一篇认证与授权(应该很快就能面世),shiro源码系列就封笔了。最近在搭建自己的后台管理系统,用到了quartz,集成的过程也遇到了一些问题,因此有了quartz的三篇文章。

慢慢的,从一味的网上找资料变成了很多时候会从源码中找答案。不求能读太多的源码,但愿自己接触的技术都能读上一读,路漫漫其修远兮,吾将上下而求索!

我为什么读源码

很多人一定和我一样的感受:源码在工作中有用吗? 用处大吗?很长一段时间内我也有这样的疑问,认为哪些有事没事扯源码的人就是在装,只是为了提高他们的逼格而已。

那为什么我还要读源码呢? 一刚开始为了面试,后来为了解决工作中的问题,再后来就是个人喜好了。说的好听点是有匠人精神;说的委婉点是好奇(底层是怎么实现的);说的不自信点是对黑盒的东西我用的没底,怕用错;说的简单直白点是提升自我价值,为了更高的薪资待遇(这里对真正的技术迷说声抱歉)。

源码中我们可以学到很多东西,学习别人高效的代码书写、学习别人对设计模式的熟练使用、学习别人对整个架构的布局,等等。如果你还能找出其中的不足,那么恭喜你,你要飞升了!会使用固然重要,但知道为什么这么使用同样重要。从模仿中学习,从模仿中创新。

读源码不像围城(外面的人想进来,里面的人想出去),它是外面的人不想进来,里面的人不想出去;当我们跨进城内,你会发现(还是城外好,皮!)城内风光无限,源码的海洋任我们遨游!

你想好入城了吗?我是怎么样读源码的

内容了解

首先我们要对我们的目标有所了解,知道她有什么特点,有些什么功能。对对方都还不了解,就想着进入别人的内心世界,那不是臭不要脸嘛,我们要做一个有着流氓心的绅士;对她有个大致的了解了,就可以发起攻势,一举拿下。

那么怎么样了解了,方式有很多,我这里提供几种,仅供参考

最好的方式就是官方参考指南,亲生父母往往对孩子是最了解的,对孩子的描述也是最详细的;比如Spring Boot Reference Guide就是对springboot最详细的描述,怎么样使用springboot、springboot特性等等,通过此指南,springboot在你面前一览无遗;但是,springboot毕竟是外国人的孩子,如果英语不好,估计读起来有点头疼了,不过我们有google翻译呀,咬咬牙也是能看的。源码世界的丈母娘、老岳丈是非常慷慨的!

其次是书籍,国外优秀的有很多,国内也不乏好书,比较推荐此方式,自成体系,让我们掌握的知识点不至于太散。这就是好比是源码的闺蜜,对源码非常了解,重点是挺大方,会尽全力帮助我们了解源码。

再次就是博客,虽然可能觉得知识点比较散,但是针对某个知识点却特别的细,对彻底掌握非常有帮助,园子内就有很多技术大牛,写的博客自然也是非常棒,非常具有学习价值。当然还有社区、论坛、github、码云等等。这就是源码的朋友圈,我们从中也能获取到非常多关于源码的信息

设计模式的了解

优秀的框架、技术从不乏设计模式;jdk源码中就应用了很多设计模式,比如IO流中的适配器模式与装饰模式、GUI的观察者模式、集合中的迭代器模式等等;spring源码中也是用到了大量的设计模式。设计模式有什么优点、各适用于什么场景,不是本文的内容,需要我们大家自行去了解。

我们只需要对一些常用的设计模式有个大致了解,再去读源码是比较好的;不需要将23种设计模式都通读,也不需要将常用设计模式完全理解透;对于全部通读,我们时间有限,另外有些模式确实不太好理解、用的少,性价比不高,没必要全部都读。

推荐书籍:《Head First Design Patterns》(中文版:《Head First 设计模式》)、《Java与模式》;

常用设计模式:单例模式、工厂模式、适配器模式、装饰模式、外观模式、代理模式、迭代器模式、观察者模式、命令模式

另外我比较推荐的一种学习设计模式的方式是读别人博客:java_my_life,刘伟技术博客,chenssy的设计模式;

设计模式之于源码,就好比逛街购物之于女人,想顺利勾搭源码,我们需要好好掌握设计模式这个套路。

配合ide进行断点追踪

我们通过源码的圈子对源码的了解终究只是停在表面,终究还是没有走进她的内心,接下来我就和大家分享下,我是如何走进她的内心的!

相信看过我的源码博客的小伙伴都知道,我非常喜欢通过idea断点来进行源码追踪,断点追踪源码是我非常推荐的一种方式。断点不仅可以用来调试我们的代码,也可以用来调试我们用到的框架源码。面对未知的、茫茫多的源码,我们往往没有足够的时间、经历和耐心去通读所有源码,我们只需要去读我们关注的部分即可(有人可能会说我都不关心,这...)。那为什么要用断掉调试的方式来跟源码,而不是直接从源代码入手去跟我们关注的部分呢?尝试过的小伙伴应该知道,如果我们对源码不熟悉,直接通过源码的方式去跟,一方面很容易迷路(多态,会有很多子类实现),不知道接下来跟哪一个,另一方面也很容易跟丢,当我们跟入的很深的时候,很有可能就忘记上一步跟到哪了。

下面我会举例来说明我是如何进行断点追踪的,以spring-boot-2.0.3之quartz集成,不是你想的那样哦!和spring-boot-2.0.3之quartz集成,数据源问题,源码探究为背景来讲,需要搞清楚两个点:springboot是如何向quartz注入数据源的,quartz是如何操作数据库的

springboot向quartz注入数据源

QuartzAutoConfiguration是springboot自动配置quartz的入口

quartz的配置属性设置给SchedulerFactoryBean;将数据源设置给SchedulerFactoryBean:如果有@QuartzDataSource修饰的数据源,则将@QuartzDataSource修饰的数据源设置给SchedulerFactoryBean,否则将应用的数据源(druid数据源)设置给SchedulerFactoryBean,显然我们的应用中没有@QuartzDataSource修饰的数据源,那么SchedulerFactoryBean中的数据源就是应用的数据源;将事务管理器设置给SchedulerFactoryBean。SchedulerFactoryBean,负责创建和配置quartz Scheduler,并将其注册到spring容器中。SchedulerFactoryBean实现InitializingBean的afterPropertiesSet方法,里面有可以设置数据源的过程。

可以看到通过org.quartz.jobStore.dataSource设置的dsName(值为quartzDs)最后会被替换成springTxDataSource.加scheduler实例名(我们的应用中是:springTxDataSource.quartzScheduler)。springboot会注册两个ConnectionProvider给quartz:一个dsName叫springTxDataSource.quartzScheduler,有事务;一个dsName叫springNonTxDataSource.quartzScheduler,没事务。

quartz如何操作数据库

我们通过停止定时任务来跟下quartz对数据库的操作

发现quartz用如下方式获取connection

conn = DBConnectionManager.getInstance().getConnection(getDataSource());

那么我们的job中就可以按如下方式操作数据库了

View Code

明确我们的目的,找到合适的切入点,进入断点调试追踪也就容易了。

任我说的天花乱坠,你仍无动于衷,那也只是我一厢情愿,只有局中人才能体会到其中的奥妙!

总结与感悟

从上至下全部通读的方式,个人不太推荐,这是建立在很熟悉的基础上的,当我们对某个框架已经比较熟悉了,再从上至下进行通读,彻底了解,这是我认为正确的方式;但是从不熟悉到熟悉这个过程,个人不推荐全部通读,而是推荐上面我推荐的方式 - 断点局部追踪。

很多时候,我们的博文都只是授之以鱼,而我们也只是从中得到鱼;而这篇的目的则是授之以渔,我希望大家从中学到捕鱼的方法,而不是一味的等待别人的鱼;希望大家能够自给自足,也能把鱼和渔都授予其他人。

只要我们开始去读源码,慢慢的就会形成自己的一套读源码的方式;每个人的方式都不一样,合适自己的才是最好的。行动起来,用合适的方式去俘获你的的她吧!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 适配器
    +关注

    关注

    8

    文章

    1951

    浏览量

    67997
  • 源码
    +关注

    关注

    8

    文章

    639

    浏览量

    29185
  • 模式
    +关注

    关注

    0

    文章

    65

    浏览量

    13383

原文标题:学会读源码,很重要!

文章出处:【微信号:mcuworld,微信公众号:嵌入式资讯精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    ade7753想要读取电流、电压、功率、电能,直接寄存器就行了吗

    想要读取电流、电压、功率、电能。直接寄存器就行了吗? 相位、增益误差方面的内容怎么进行设置?
    发表于 12-25 07:59

    你我

    你我的事
    发表于 02-28 18:32

    【微信精选】学源码居然和追女孩子是同一回事!这个解释不得不服

    会发现(还是城外好,皮!)城内风光无限,源码的海洋任我们遨游!你想好入城了吗?我是怎么
    发表于 08-06 07:00

    请问这俩寄存器地址不是一了吗

    问一下sfrP2OD = 0x93;***itP23= 0x93;这俩地址不是一了吗???
    发表于 08-27 04:35

    如何tft型号?

    求助如何tft 型号啊? 上电复位后直接就是了吗?屏说是兼容 ili9320时序的,9320程序可以直接驱动同样的3块屏读出来的总是FFFF白屏,是什么情况?
    发表于 07-31 02:58

    iPhone8什么时候上市:情不知所起一往而深!iPhone8哪些黑科技青睐你心?

    2017年是iPhone的十周年,所以近期关于iPhone2017年发布会的消息不断,爆料简直就是波接着一波,并且爆出的都是猛料,黑科技众多加持的iPhone8,你想好要卖几个肾了吗
    发表于 01-16 16:20 4014次阅读

    华为mate10,mate10pro与保时捷定制版三选一你选谁?

    昨晚8点,华为正式在德国慕尼黑发布了华为mate10、mate10Pro和mate10保时捷设计。这对于华为粉丝来说,无疑是一颗重磅炸弹。那么这三选一你想好了吗
    发表于 10-17 17:10 4910次阅读

    新科技对你我的生活的7大影响

    当人工智能、物联网、虚拟现实、增强现实、脸部识别等技术逐渐成熟,应用层面也随之扩大。看这些新科技如何翻转你我的生活。
    的头像 发表于 01-02 10:59 7714次阅读

    机器人具备像人类一思考的能力了吗

    科技时代的来临,人们总在忧心会被机器取代。可是,从人工智能起源至今,60多年过去了,机器具备像人类一思考的能力了吗
    发表于 10-22 15:18 7241次阅读

    耳机需不需要一个功放

    你想好好享受音乐,经过数小时甚至数天痛苦的研究后,决定忍痛剁手买了一副好的耳机,把随机赠送的差耳机换掉,你以为这样就可以了吗?No。
    的头像 发表于 04-30 10:42 1.6w次阅读

    学会源码特别重要

    刚参加工作那会,没想过去源码,更没想过去改框架的源码;总想着别人的框架应该是完美的、万能的,应该不需要改;另外即使我改了源码,怎么让我的
    的头像 发表于 12-31 10:29 1596次阅读
    学会<b class='flag-5'>读</b><b class='flag-5'>源码</b>特别重要

    你想要的电压在你想要的地方

    你想要的电压在你想要的地方
    发表于 05-19 09:09 2次下载
    <b class='flag-5'>你想</b>要的电压在<b class='flag-5'>你想</b>要的地方

    我们怎样源码才能更高效

    用了这么久的 Redis,也翻了很多次源码,经常有人问我到底怎么 Redis 源码。 一提到源码,很多人都会比较畏惧,认为
    的头像 发表于 11-12 09:38 1658次阅读
    我们怎样<b class='flag-5'>读</b><b class='flag-5'>源码</b>才能更高效

    新春佳节你想好送什么了吗?爱国者告诉你满意的答案

    虎年的钟声即将敲响,忙碌了一年的你春节期间最期待的事情是什么?是与父母亲人欢聚一堂,还是约三五好友喝几杯互相调侃呢?相信对于很多年轻人而言,约上朋友一起“开黑”才是迎接新年最正确的打开方式。 在很多人的眼里,90后、00后是伴随着游戏一路成长过来的,事实也确实如此,在网络迅速崛起之后,网络以一种全新的方式走进了每个人的生活中,而网络游戏也以一种休闲、娱乐、放松的方式伴随着这一时期的孩子们共同成长。从小时候
    的头像 发表于 01-29 16:09 1066次阅读
    新春佳节<b class='flag-5'>你想好</b>送什么<b class='flag-5'>了吗</b>?爱国者<b class='flag-5'>告诉</b>你满意的答案

    条码二维码识器厂商告诉你,条码识设备有哪些产品形态?

    条码识设备有哪些常见的产品形态?我们常见的条码识设备应该是扫码枪,它外形小巧便携,操作简单方便。这种设备适用于需要频繁扫描条码的场景,例如超市收银或仓库管理等比较多见。条码扫描枪通常通过无线或有
    的头像 发表于 10-18 15:00 1165次阅读
    条码二维码识<b class='flag-5'>读</b>器厂商<b class='flag-5'>告诉</b>你,条码识<b class='flag-5'>读</b>设备有哪些产品形态?