Java源码阅读的真实体会(一种学习思路)

 

刚才在论坛不经意间,看到有关源码阅读的帖子。回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动。

源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心。

 

说到技术基础,我打个比方吧,如果你从来没有学过Java,或是任何一门编程语言如C++,一开始去啃《Core Java》,你是很难从中吸收到营养的,特别是《深入Java虚拟机》这类书,别人觉得好,未必适合现在的你。

虽然Tomcat的源码很漂亮,但我绝不建议你一开始就读它。我文中会专门谈到这个,暂时不展开。

 

强烈的求知欲,我认为是阅读源码的最核心驱动力。我见到绝大多数程序员,对学习的态度,基本上就是这几个层次(很偏激哦):

1、只关注项目本身,不懂就baidu一下。

2、除了做好项目,还会阅读和项目有关的技术书籍,看wikipedia。

3、除了阅读和项目相关的书外,还会阅读IT行业的书,比如学Java时,还会去了解函数语言,如LISP。

4、找一些开源项目看看,大量试用第三方框架,还会写写demo。

5、阅读基础框架、J2EE规范、Debug服务器内核。

 

大多数程序都是第1种,到第5种不光需要浓厚的兴趣,还需要勇气:我能读懂吗?其实,你能够读懂的。

 

耐心,真的很重要。因为你极少看到阅读源码的指导性文章或书籍,也没有人要求或建议你读。你读的过程中经常会卡住,而一卡主可能就陷进了迷宫。这时,你需要做的,可能是暂时中断一下,再从外围看看它:如API结构、框架的设计图。

 

我就说说如何读Java源码,以及我曾经的阅读感悟。

 

Java源码初接触

如果你进行过一年左右的开发,喜欢用eclipse的debug功能。好了,你现在就有阅读源码的技术基础。

我建议从JDK源码开始读起,这个直接和eclipse集成,不需要任何配置。

 

可以从JDK的工具包开始,也就是我们学的《数据结构和算法》Java版,如List接口和ArrayList、LinkedList实现,HashMap和TreeMap等。这些数据结构里也涉及到排序等算法,一举两得。

面试时,考官总喜欢问ArrayList和Vector的区别,你花10分钟读读源码,估计一辈子都忘不了。

 

然后是core包,也就是String、StringBuffer等。

如果你有一定的Java IO基础,那么不妨读读FileReader等类。我建议大家看看《Java In A Nutshell》,里面有整个Java IO的架构图。Java IO类库,如果不理解其各接口和继承关系,则阅读始终是一头雾水。

Java IO 包,我认为是对继承和接口运用得最优雅的案例。如果你将来做架构师,你一定会经常和它打交道,如项目中部署和配置相关的核心类开发。

 

读这些源码时,只需要读懂一些核心类即可,如和ArrayList类似的二三十个类,对于每一个类,也不一定要每个方法都读懂。像String有些方法已经到虚拟机层了(native方法),如hashCode方法。

 

当然,如果有兴趣,可以对照看看JRockit的源码,同一套API,两种实现,很有意思的。

如果你再想钻的话,不妨看看针对虚拟机的那套代码,如System ClassLoader的原理,它不在JDK包里,JDK是基于它的。JDK的源码Zip包只有10来M,它像是有50来M,Sun公司有下载的,不过很隐秘。我曾经为自己找到、读过它很兴奋了一阵。

 

Java Web开发源码

在阅读Tomcat等源码前,一定要有一定的积累。我的切实体会,也可以说是比较好的阶梯是:

1、写过一些Servlet和JSP代码。注意,不是用什么Struts,它是很难接触到Servlet精髓的。用好Struts只是皮毛。

2、看过《Servlet和JSP核心编程》

3、看过Sun公司的Servlet规范

4、看过http协议的rfc,debug过http的数据包

如果有以上基础,我也不建议你开始读Tomcat源码。我建议你在阅读Tomcat源码前,读过Struts源码,Struts源码比WebWork要简单得多。这个框架是可以100%读懂的,至少WebWork我没有100%读懂。我曾经因为读懂了Struts源码,自己写过一个Web框架。

 

当然,在读Struts框架前,最好看过它的MailReader等demo,非常非常不错的。

如果你做过一些Struts项目,那么读它时就更得心应手了。

在读Struts前,建议看看mvnforum的源码,它部分实现了Struts的功能,虽然这个BBS做得不敢恭维。

 

如果你读过Struts,再开始考虑Tomcat源码阅读吧。

不过,我还是不建议直接读它,先读读onJava网站上的系列文章《How Tomcat Works》吧,它才是Tomcat的最最简易版。它告诉你HttpServletRequest如何在容器内部实现的,Tomcat如何通过Socket来接受外面的请求,你的Servlet代码如何被Tomcat容器调用的(回调)。

学习JSP,一定要研读容器将JSP编译后的Servlet源码。

为什么我总是称呼Tomcat为容器,而不是服务器?这个疑问留给大家吧。

 

如果你一定要读Tomcat,那么就读Jetty吧。至少它是嵌入式,可以直接在eclispe里面设置断点debug。虽然Tomcat也有嵌入式版本。

 

Java数据库源码阅读

我建议,先读读Sun的JDBC规范。

我想你一定写过JDBC的代码,那么这时候可以开始阅读源码了。

如果了解JDBC规范(接口),那么它的实现,JDBC Driver就一定要开始了解,我的建议是,读读mysql的jdbc驱动,因为它开源、设计优雅。在读mysql的JDBC驱动源码时,建议看看mysql的内幕,官方正好有本书,《Mysql Internals》,我五年前读过一部分。比如你可以知道mysql的JDBC驱动,如何通过socket数据包(connect、query),给这个C++开发的mysql服务器交互的。

 

通过上面的阅读,你可以知道,你的业务代码、JDBC规范、JDBC驱动、以及数据库,它们是如何一起协作的。

如果你了解这些内幕,那么你再学习Hibernate、iBatis等持久化框架时,就会得心应手的。

 

读过JDBC驱动,那么下一步一定要读读数据库了。而正好有一个强大的数据库是用Java开发的,Hsqldb。它是嵌入式数据库,比如用在桌面客户端软件里,如Mail Client。

我四年前为此写过一篇小文,就不介绍了。

 

Java通讯及客户端软件

我强烈推荐即时通讯软件wildfire和Spark。你可以把wildfire理解成MSN服务器,Spark理解成MSN客户端。它们是通过XMPP协议通讯的。

我曾经在一个项目中,定制过Spark,当然也包括服务端的一些改动。所以它们的源码我都读过。

我之所以推荐它们。是因为:

1、XMPP够轻量级,好理解

2、学习Socket通讯实现,特别是C/S架构设计

3、模块化设计。它们都是基于module的,你既可以了解模块化架构,还可以了解模块化的技术支撑:Java虚拟机的ClassLoader的应用场景。

4、Event Driven架构。虽然GUI都是Event驱动的,但Spark的设计尤其优雅

 

这么说吧,读它们的源码,你会为做一名程序员而自豪,因为无论是他们的架构设计还是代码,都太漂亮了。

 

Java企业级应用

当然了,就是Hibernate、Spring这类框架。

在读Spring源码前,一定要先看看Rod Johnson写的那边《J2EE Design and Development》,它是Spring的设计思路。注意,不是中文版,中文版完全被糟蹋了。

在读Hibernate源码前,一定要读读Gavin King写的那本《Hibernate in Action》,同时,应该再读读Martin Fowler写的《企业应用架构模式》,它专门谈到持久化框架的设计思路。当你觉得这两本书读透了,再去看它们源码吧。

而且,在读源码前,你会发现它们用到很多第三方Jar包,二三十个,你最好把那些Jar包先一个个搞明白。

 

说到企业应用,一定会涉及到工作流。我当年读过jBPM的源码,网上有介绍jBPM内核的文章(银狐)。我感觉它的内核也就两千行,不要害怕。我曾经阅读jBPM源码的博客。

当然了,读工作流源码,前提是一定要对其理论模型有深入的了解,以及写过一些demo、或做过一些项目。

 

我上面介绍的这些,是我自己读过的,也适合一般人阅读。

我也读过一些非Java源码,感觉不错,也推荐给大家:

dojo源码 它的架构设计得很优雅,仿Java的import和extends。但实际应用起来一塌糊涂。我们当年基于这个开发了自己的框架,不过我不是主力。

 

Flex源码 Flex 08年底刚刚开源后,我就用它做过一个中型项目,应该说是国内的技术先行者。当时市面没有有深度的书,也没有开源项目。我纯粹是看Flex的Help文档和源码,把项目搞定的。两三年过去了,现在觉得系统设计得蛮优雅的。

 

好了,先介绍到这里。

上面说到的这些Java源码,我都是4年前、甚至更早读过的。技术变化这么快,像互联网的高速发展,催生很多高性能、分布式数据库,如hadoop。我一看,发现自己已经落伍了。

这几年,想必已经出现了很多优秀的框架,大家不妨分享出来。

posted @ 2018-11-04 15:59 GordonDicaprio 阅读(366) 评论(0) 推荐(0) 编辑
摘要: 转载:https://www.freesion.com/article/9459909831/ 问题对应的代码片段 protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nu 阅读全文
posted @ 2021-10-24 19:27 GordonDicaprio 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 原文地址 跨域资源共享 CORS 详解 跨域资源共享 CORS 详解 作者: 阮一峰 日期: 2016年4月12日 CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克 阅读全文
posted @ 2021-01-10 21:50 GordonDicaprio 阅读(54) 评论(0) 推荐(0) 编辑
摘要: 原文地址: RequestDispatcher接口include方法 web.xml: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http 阅读全文
posted @ 2021-01-10 20:40 GordonDicaprio 阅读(394) 评论(0) 推荐(1) 编辑
摘要: package com.lookcoder.perpayadmin.util; import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.core.too 阅读全文
posted @ 2020-05-15 21:06 GordonDicaprio 阅读(433) 评论(0) 推荐(0) 编辑
摘要: maven项目pom.xml中parent标签的使用 阅读全文
posted @ 2020-05-12 09:19 GordonDicaprio 阅读(1459) 评论(0) 推荐(0) 编辑
摘要: .\ffmpeg.exe -i E:\\ffmepg\\test.mp4 -c copy -strict -2 -bsf:v h264_mp4toannexb -f hls -hls_list_size 0 -hls_time 3 -hls_segment_filename 'E:\ffmepg\m 阅读全文
posted @ 2020-05-09 01:42 GordonDicaprio 阅读(170) 评论(0) 推荐(0) 编辑
摘要: java 直接读取zip文件和文件内容 - 并发读取 package com.lookcoder.utils; import java.io.*; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; i 阅读全文
posted @ 2020-05-08 16:19 GordonDicaprio 阅读(3906) 评论(0) 推荐(0) 编辑
摘要: nvm安装后node生效但是npm不生效 阅读全文
posted @ 2020-05-07 10:23 GordonDicaprio 阅读(1861) 评论(0) 推荐(0) 编辑
摘要: 安卓6.0新特性在Fragment申请运行时权限 今天在Fragment申请权限时代码如下: public void getContacts(){ int flag = ActivityCompat.checkSelfPermission(getActivity(), Manifest.permis 阅读全文
posted @ 2020-04-30 11:11 GordonDicaprio 阅读(868) 评论(0) 推荐(0) 编辑
摘要: 在Android 8.0中使用Notification中发生 Bad notification for startForeground错误 String CHANNEL_ONE_ID = "CHANNEL_ONE_ID";String CHANNEL_ONE_NAME= "CHANNEL_ONE_I 阅读全文
posted @ 2020-04-28 15:48 GordonDicaprio 阅读(4869) 评论(0) 推荐(0) 编辑
摘要: 说说 Android 中的通知(Notification) - CSDN博客 说说 Android 中的通知(Notification) 阅读全文
posted @ 2020-04-28 10:25 GordonDicaprio 阅读(291) 评论(0) 推荐(0) 编辑
摘要: Android中利用NotificationListenerService实现的收款通知监听 阅读全文
posted @ 2020-04-28 09:35 GordonDicaprio 阅读(708) 评论(0) 推荐(0) 编辑
摘要: NotificationListenerService的那些事儿 Android中利用NotificationListenerService实现的收款通知监听 Android中监听通知消息的实现 阅读全文
posted @ 2020-04-28 09:29 GordonDicaprio 阅读(817) 评论(0) 推荐(0) 编辑
摘要: 比特币为主的数字货币挖矿,总会涉及到各种各样的算力单位,比如多少多少T,多少TH/S。但并不是所有矿机的算力单位都是T,还有多少K的。比如说到比特币全网算力的时候,总是用E或者EH/S来表示。 前几年的矿机,算力总是用多少M(MH/S),多少G(GH/S)来表示,这些单位跟T之间是怎样的关系?比如1 阅读全文
posted @ 2020-04-24 14:09 GordonDicaprio 阅读(19638) 评论(0) 推荐(0) 编辑
摘要: 从零实现一个功能完善的迷你区块链 阅读全文
posted @ 2020-04-24 13:42 GordonDicaprio 阅读(238) 评论(0) 推荐(0) 编辑
摘要: Merkle Tree理解起来并不难 2018-05-03 19:17 全链社将链行业的既有资讯以专题的形式展示,每个专题提供一个知识点,为读者提供不一样的思考角度。 本期专题:默克尔树 本文原标题:Merkle Tree(默克尔树)算法解析 Merkle Tree(默克尔树),通常也被称作Hash 阅读全文
posted @ 2020-04-24 10:03 GordonDicaprio 阅读(268) 评论(0) 推荐(0) 编辑
摘要: 微信、支付宝个人收款的一种实现思路 微信、支付宝个人收款的一种实现思路 微信、支付宝个人收款的一种实现思路 March 11, 2018 题目里说的个人收款指的不是普通的扫个码,而是说那种可以支持回调的,例如网上商城支付之后,商城可以知道支付状态并且自动修改订单的状态为“已支付”。这种支付的形式,无 阅读全文
posted @ 2020-04-22 16:58 GordonDicaprio 阅读(776) 评论(0) 推荐(0) 编辑
摘要: https://blog.csdn.net/Rong_Toa/article/details/88917424 阅读全文
posted @ 2020-04-20 22:50 GordonDicaprio 阅读(2442) 评论(0) 推荐(0) 编辑
摘要: java list 按照多字段排序 list 排序涉及的接口 Comparator, 具体实现代码如下,以Apple类为例 public class Test{ public static void main(String [] args){ List<Apple> apples = new Arr 阅读全文
posted @ 2020-04-14 14:02 GordonDicaprio 阅读(4591) 评论(0) 推荐(1) 编辑
摘要: 2019年最新全国省市区街道共46462条数据(统计局MySQL数据库) 查看百度网盘: 看到有很多朋友没有积分,很理解找资源费时间的心情,现已上传到百度云盘,直接下载 https://pan.baidu.com/s/1fDeEp5C-WGx-6Z1xPDjwGg 提取码:9ki4 只求给文章点个赞 阅读全文
posted @ 2020-04-13 10:19 GordonDicaprio 阅读(1368) 评论(2) 推荐(5) 编辑
摘要: 一份非常值得一看的Java面试题 阅读全文
posted @ 2020-04-10 10:19 GordonDicaprio 阅读(264) 评论(0) 推荐(0) 编辑
摘要: 通俗易懂spring之singleton和prototype spring scope prototype与singleton区别 阅读全文
posted @ 2020-04-09 11:31 GordonDicaprio 阅读(197) 评论(0) 推荐(0) 编辑
摘要: TCP的三次握手与四次挥手理解及面试题(很全面) http请求与响应,TCP三次握手&四次分手 阅读全文
posted @ 2020-04-09 09:31 GordonDicaprio 阅读(314) 评论(0) 推荐(0) 编辑
摘要: HTTP协议三次握手过程 阅读全文
posted @ 2020-04-09 09:25 GordonDicaprio 阅读(458) 评论(0) 推荐(1) 编辑
摘要: Java二分查找法Java冒泡排序Java选择排序Java插入排序Java希尔排序Java计数排序Java快排算法Java归并排序Java堆排序动图演示 阅读全文
posted @ 2020-04-07 14:49 GordonDicaprio 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 接口层 Sqlsession DefaultSqlSessionFactory SqlSessionManager 处理层 配置解析 BaseBuilder XMLConfigBUilder XMLMapperBuilder XMLStatementBuilder 参数映射 SQL解析 SqlNod 阅读全文
posted @ 2020-04-07 10:20 GordonDicaprio 阅读(181) 评论(0) 推荐(0) 编辑
摘要: Servlet扩展 Servlet ServletConfig GenericServlet HttpServlet 初始化组件: HttpServletBean FrameworkServlet DispatcherServlet 九大组件: HandlerMapping HandlerAdapt 阅读全文
posted @ 2020-04-07 09:23 GordonDicaprio 阅读(202) 评论(0) 推荐(0) 编辑
摘要: Java Web中的include Servlet的forward与include方法 阅读全文
posted @ 2020-04-03 18:11 GordonDicaprio 阅读(504) 评论(0) 推荐(0) 编辑
摘要: HandlerMethodArgumentResolver(一):Controller方法入参自动封装器(将参数parameter解析为值)【享学Spring MVC】 阅读全文
posted @ 2020-04-02 11:29 GordonDicaprio 阅读(190) 评论(0) 推荐(0) 编辑
摘要: SpringMVC学习笔记15 @InitBinder注解 SpringMvc @InitBinder 阅读全文
posted @ 2020-04-02 11:09 GordonDicaprio 阅读(223) 评论(0) 推荐(0) 编辑
摘要: SpringMVC @SessionAttributes 使用 该观点在新版本SpringMVC中是否更新:通过@ModelAttributes和@SessionAttributes共同添加至session中的数据,只会添加一次 springmvc基础知识(19):@SessionAttribute 阅读全文
posted @ 2020-04-02 10:44 GordonDicaprio 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 全面解析Spring中@ModelAttribute注解的用法 阅读全文
posted @ 2020-04-02 10:36 GordonDicaprio 阅读(314) 评论(0) 推荐(0) 编辑
摘要: 1.request中相关的参数 url中的参数 post过来的参数 请求头中所包含的值 2.cookie中的参数 3.session中的参数 4.设置到FlashMap中的参数,这种参数主要用于redirect的参数传递。 5.SessionAttributes传递的参数,这类参数通过@Sessio 阅读全文
posted @ 2020-04-02 10:23 GordonDicaprio 阅读(165) 评论(0) 推荐(0) 编辑
摘要: SpringBoot2 | SpringBoot启动流程源码分析(一) SpringBoot2 | SpringBoot启动流程源码分析(二) SpringBoot2 | @SpringBootApplication注解 自动化配置流程源码分析(三) SpringBoot2 | SpringBoot 阅读全文
posted @ 2020-03-31 17:33 GordonDicaprio 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 1. 首先下载apache安装包,并解压到指定目录。(windows版本) https://www.apachehaus.com/downloads/httpd-2.4.41-o111c-x64-vc15-r2.zip 2. 修改conf/httpd.conf配置文件 2.1SRVROOT 后改为a 阅读全文
posted @ 2020-03-29 11:49 GordonDicaprio 阅读(353) 评论(0) 推荐(0) 编辑
摘要: shiro中多用户的登陆页面(multiple login pages)配置 <bean id="membersAuthc" class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter"> <property name="log 阅读全文
posted @ 2020-03-23 17:45 GordonDicaprio 阅读(2471) 评论(0) 推荐(0) 编辑
摘要: SSM整合shiro实现多用户表多Realm统一登录认证(大章附代码) 前言说明一下需求,最近做的平台,有多张用户表,怎么根据不同用户登录去执行自己查询不同数据库并实现认证的业务逻辑呢? 博主参与的产品开发进入阶段性完成期,有时间将过程中遇到的相关问题一一总结。 总结实现本需求,首先是从Subjec 阅读全文
posted @ 2020-03-23 12:09 GordonDicaprio 阅读(1324) 评论(0) 推荐(0) 编辑
摘要: package com.ruoyi.generator.config; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.Conf 阅读全文
posted @ 2020-03-20 16:54 GordonDicaprio 阅读(544) 评论(0) 推荐(0) 编辑
摘要: spring允许用户通过depends-on属性指定bean前置依赖的bean,前置依赖的bean会在本bean实例化之前创建好: 阅读全文
posted @ 2020-03-20 14:54 GordonDicaprio 阅读(347) 评论(0) 推荐(0) 编辑
摘要: https://blog.csdn.net/u013995395/article/details/90718739 阅读全文
posted @ 2020-03-20 14:50 GordonDicaprio 阅读(442) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示