怎么阅读Spring源码?

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】

作者:陈龙

链接:https://www.zhihu.com/question/21346206/answer/349792663

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

知乎上有个很热门的问题,天天在我的首页推荐里见到:

你亲眼看着什么东西「向奇怪的地方发展过去了」?www.zhihu.com20191017100249\_1.png

我一直想回答,但是由于我的答案是软件开发相关的,比较小众,怕别人很难理解。现在这个关于Spring的问题的回答就算是我对”你亲眼看着什么东西向奇怪的地方发展过去了”这个问题的回答吧。

软件开发的一个亘古不变的方针就是抽象透明和封装。语言从汇编到面向过程到面向对象,开发从原生代码到类库到框架,都是这个趋势。别说软件开发了,就说软件使用吧,从DOS命令行到GUI图形化界面,也是这个方向。

抽象、透明、封装就是不让你陷入到底层的细节当中,把精力专注在你那一层面的问题上。什么叫你那一层面的问题?你开发产品或者项目,就把精力用在实现业务上。并不是底层不重要,而是没必要到去看源代码的地步!

回复一下评论区,回复并不仅限于对

@Jeffrey Li ,而是在我最早写完这个回答之后就一直想补充的内容。只是Jeffery Li的评论正好让我有了别偷懒的理由。

1,

相反,提供了Spring核心代码入口和核心代码是什么的答主才是对提问者帮助最大的。

就像我在另一个问题回答”Java新手如何学习Spring、Struts、Hibernate三大框架?”里说的一样,我的回答就是从这个问题引流的,回答的链接在下面会有。

如果有人在知乎里提问:有什么好的自杀方法?如果必须要我回答这个问题,我的回答一定是把他引导到积极向上的生活态度上去,而不是认认真真的列几个自杀的方法。如果你觉得这个例子有点极端,那么”Java新手如何学习Spring、Struts、Hibernate三大框架?”这个例子更贴切一些。

我也从来不反对阅读源代码,但是要分清楚哪些源代码。在绝大部分程序员的眼里,抱着学习的态度阅读源代码指的就是框架的源代码。这个观点是错误的。该阅读哪些源代码,我在”作为一名前端开发人员,有哪些值得一读的js代码?”这个回答里也写了。虽然是前端的问题,但其实道理在服务器端也适用。

2,

阅读文档可以让你做到如何熟练使用一个工具,而阅读源代码可以让你了解如何更好的设计好一个系统。

这句话前半句是对的。不过文档的另外一个主要目的就是指导你了解如何更好的设计一个系统。例如Spring Boot文档开始就说:

Takes an opinionated view of building production-ready Spring applications.

\<img src="https://pic3.zhimg.com/50/v2-54e022997528df1cf84cc5e1dd8578a7\_hd.jpg" data-caption="" data-size="normal" data-rawwidth="682" data-rawheight="476" class="origin_image zh-lightbox-thumb" width="682" data-original="https://pic3.zhimg.com/v2-54e022997528df1cf84cc5e1dd8578a7\_r.jpg"\>;
20191017100249\_2.png

什么是Opinionated?到底Spring Boot想向开发者传达或者提倡一种什么样的Opinion?答案都在文档里直截了当写了。如果要在源代码里找答案…你要看多少代码才能抽取出文档想表达的思想?

代码是最好的文档,这句话只是大多数情况下程序员自欺欺人的。但是代码确实有文档不可替代的作用,所以在绝大多数程序开发相关的文档中都会夹杂源代码实例,Spring的官方文档也不例外。

一段精巧的算法代码,你写一大篇文档让我看,还不如让我直接看代码。如果同事遇到一个Bug让我帮助解决,先给我写一篇文档?还不如直接让我看代码。但是像Spring这种级别的,你还是去看文档吧。

3,

但如果你累积越多制造轮子的经验,越有利于成功建造复杂系统。

问题是绝大多数程序员要成功建造的复杂系统都不是Spring。Spring和绝大多数程序员要开发的产品或项目有很大的不同。

在下面这篇知乎文章里搜”逆向”这个词,你就知道什么情况才需要把别人的发动机拆开了仔细研究。竞品!你要开发汽车发动机,你拆开奔驰的看看。你只是驾驶骑车,你拆发动机干嘛?

吉姆:中国自主研发的发动机,你知道多少?zhuanlan.zhihu.com20191017100249\_3.png

你要用Spring做Java服务器端应用,那你就去看看其他用Spring做的应用。Spring官方给你提通了大量例子,里面都已经体现了最佳实践。这些代码为什么不看?

下面是原答案:

—————————————————————–

我想先问一下题主和有些答主,http://spring.io上的文档你们都读了几遍了?

所有项目的文档读不过来没事,spring framework这一个项目的reference有完整从头到尾读一遍的吗?

然后再来问怎么阅读spring源代码,或者回答人家如何阅读spring源代码。

详细认真读过spring所有项目的reference,并对所有API doc了如指掌的人都少之又少。你先开始读源代码干嘛?

说明书和各种电器参数都不看就想把家里的电视拆了研究的,只能是熊孩子干出来的事。

我见到太多简历里面写阅读Linux源代码的,这些人无一例外都是浮躁型的。

不建议读框架的源代码,如何实现一个框架和如何用框架实现业务有很大的不同,在阅读底层框架源代码上的时间精力投入相比收获来说不划算。

只有下面三种情况,你可能需要阅读源代码:

  1. 你打算发明一个类似Spring Framkework一样的框架,可以参考源代码。
  2. 你自认为发现了Spring的一个Bug,并提交到官方的Issues list,且得到确认。而你想贡献自己的力量帮助Spring团队解决这个Bug。不过在你发现疑似Bug的时候,最好先去Issues list里面或者stackoverflow上找一下答案再说。以目前Spring的健壮性和被广泛采用的程度,几乎没有可能有一个Bug被你捡漏。
  3. Debug跟踪进入底层框架代码的时候,不得不看两眼。

反过来想想,如果什么框架要你必须阅读源代码才能掌握,那这个框架一定很烂、不成熟,或者说至少处于成熟的前期

为什么这么说呢?像Google、Facebook、Microsoft等大厂,开源项目是专职团队做的,是有专门的文档编写和社区关系维护人员的。但有些开源团队确实是几个大牛用业余时间在做。没有专职的文档和公关人员。他们前期的精力肯定是要放在开发框架本身上。框架基本满意了,才开始考虑文档,然后还可能顺手把网站也搞漂亮点。Spring和Hibernate很早很早以前都是属于这种情况。

我把话说直接点吧:所有跳过文档这一步就想直接阅读源代码的,只能是英文水平不行,读不懂文档又急于求成。

不仅仅是服务器端哦,前端也有同样的问题,看我在另一个镜像问题里的回答:

作为一名前端开发人员,有哪些值得一读的js代码?www.zhihu.com20191017100249\_4.png

—上—面—是—原—答—案————————-

评论区有人找不到文档的。这样找:

http://spring.io然后选择Projects,然后选择具体的Project,例如Spring Framework。

\<img src="https://pic3.zhimg.com/50/v2-f339dcf19101dbf27b5cdc2764156d79\_hd.jpg" data-caption="" data-size="normal" data-rawwidth="1039" data-rawheight="910" class="origin_image zh-lightbox-thumb" width="1039" data-original="https://pic3.zhimg.com/v2-f339dcf19101dbf27b5cdc2764156d79\_r.jpg"\>;
20191017100249\_5.png

如果需要熟悉这个Project的基本用法,可以在红框里的Guides和Tutorials。这些东西都是有源代码的,github地址:

Spring Guidesgithub.com20191017100249\_6.png

要看源代码,看这些就好。

其他所有项目,Spring都有详细的Guides,Examples,例如Spring boot的所有例子代码:

\<img src="https://pic2.zhimg.com/50/v2-d7a9c3808f56a9c4c2ce63baebb66a0b\_hd.jpg" data-caption="" data-size="normal" data-rawwidth="1385" data-rawheight="786" class="origin_image zh-lightbox-thumb" width="1385" data-original="https://pic2.zhimg.com/v2-d7a9c3808f56a9c4c2ce63baebb66a0b\_r.jpg"\>;
20191017100249\_7.png

这里推荐一个Chrome插件,用来在Chrome浏览器左侧显示当前github项目目录的,就像我上面的截图,比在右侧的列表里点击方便的多。插件叫Octotree,地址在:

https://chrome.google.com/webstore/detail/octotree/bkhaagjahfmjljalopjnoealnfndnagc?utm_source=chrome-app-launcher-info-dialogchrome.google.com

这个插件还不爽,你还想继续在代码里驰骋?那就用Github自家的客户端工具Clone到本地:

Simple collaboration from your desktopdesktop.github.com \<img src="https://pic1.zhimg.com/50/v2-e817f07f72dfa7be79f683e8941e1bb1\_hd.jpg" data-caption="" data-size="normal" data-rawwidth="960" data-rawheight="660" class="origin_image zh-lightbox-thumb" width="960" data-original="https://pic1.zhimg.com/v2-e817f07f72dfa7be79f683e8941e1bb1\_r.jpg"\>;
20191017100249\_8.png\<img src="https://pic2.zhimg.com/50/v2-f5ebdd6628c0a29a531516c9d28b57b6\_hd.jpg" data-size="normal" data-rawwidth="1920" data-rawheight="1320" class="origin_image zh-lightbox-thumb" width="1920" data-original="https://pic2.zhimg.com/v2-f5ebdd6628c0a29a531516c9d28b57b6\_r.jpg"\>;
20191017100249\_9.png图片来自 desktop.github.com

Guides和Tutorials,以及他们的源码看完了,你一定有很多疑问和不解,带着这些疑问去看文档。文档在绿框里。选择当前(Current)版本并且是GA(General Availability)的。

比如当前GA的Spring Framework的reference地址是:

Spring Framework Documentationdocs.spring.io

另外,如果觉得HTML的看起来不方便,可以看PDF的。PDF可以方便你在ipad或kindle上看。PDF地址,以前官网都是给出的,现在找不到了。但是只要记住上面的地址后面加上/pdf即可:

Index of /spring/docs/current/spring-framework-reference/pdfdocs.spring.io

关于如何看文档,这里摘录我在其他问题里的回答:

我个人认为的任何软件技术的最佳入门路径都是:1:先看官方文档。好的技术和框架,官方文档一定全面丰富详实,JHipster就是这样,
http://Spring.io更是好文档的典范。所以先把官方文档过一遍,理解的就理解,不理解的要记住在文档的哪一节。2:开始实践!有些知识只有实践的过程中才能理解,并且加深认识。遇到问题,知道这个问题对应文档的哪一部分,然后去查文档。3:做完一两个实际项目之后,返回去再读一遍文档,这时你会发现自己站在一个新高度上。4:1/2/3部分循环…

上面内容摘自我在这个问题下的回答:

Java新手如何学习Spring、Struts、Hibernate三大框架?www.zhihu.com20191017100249\_10.png

如果你想用好Spring的某一个Project,上面步骤足以。

全部的Spring文档在这里:

Spring Documentationspring.io20191017100249\_11.png\<img src="https://pic3.zhimg.com/50/v2-a4905bc25e63472e5b87cad5cec65a31\_hd.jpg" data-caption="" data-size="normal" data-rawwidth="1042" data-rawheight="690" class="origin_image zh-lightbox-thumb" width="1042" data-original="https://pic3.zhimg.com/v2-a4905bc25e63472e5b87cad5cec65a31\_r.jpg"\>;
20191017100249\_12.png


来源:[]()

赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » 怎么阅读Spring源码?

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏