该用户从未签到
|
源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心。
# l! v8 |" ?9 a; E# F7 w) F3 b
说到技术基础,我打个比方吧,如果你从来没有学过java,或是任何一门编程语言如C++,一开始去啃《Core Java》,你是很难从中吸收到营养的,特别是《深入Java虚拟机》这类书,别人觉得好,未必适合现在的你。 . Y- S5 n1 a k9 z2 ^& w
虽然Tomcat的源码很漂亮,但我绝不建议你一开始就读它。我文中会专门谈到这个,暂时不展开。
- }5 n k$ O4 m$ l; B
2 A: ?2 w4 L. w. K. _" p( N强烈的求知欲,我认为是阅读源码的最核心驱动力。我见到绝大多数程序员,对学习的态度,基本上就是这几个层次(很偏激哦): , _) g h1 x+ s1 K1 E& I
1、只关注项目本身,不懂就baidu一下。 I/ b( G: n8 e
2、除了做好项目,还会阅读和项目有关的技术书籍,看wikipedia。
- x3 f1 o/ a5 l3 C& `8 D. E3、除了阅读和项目相关的书外,还会阅读IT行业的书,比如学Java时,还会去了解函数语言,如LISP。 2 T; o& U* U, |, |4 R, W( x
4、找一些开源项目看看,大量试用第三方框架,还会写写demo。 : W& x; f3 x# J
5、阅读基础框架、J2EE规范、Debug服务器内核。 8 _1 E2 b0 ^+ L! h) [' \6 U- W0 r/ }6 J
* v- V6 I# b9 U2 ~* D大多数程序都是第1种,到第5种不光需要浓厚的兴趣,还需要勇气:我能读懂吗?其实,你能够读懂的。 % n0 V6 s, \+ |; n) D- s+ S
3 H* `: C, P0 s, \% N4 c* _) e+ ~耐心,真的很重要。因为你极少看到阅读源码的指导性文章或书籍,也没有人要求或建议你读。你读的过程中经常会卡住,而一卡主可能就陷进了迷宫。这时,你需要做的,可能是暂时中断一下,再从外围看看它:如API结构、框架的设计图。
0 C" N5 N# p8 r, O) g
" u0 d' H" q% q- a2 ?8 C+ G我就说说如何读java源码,以及我曾经的阅读感悟。
& l0 T% n. R: q! h) V
: ^( s, `: ?; `; zJava源码初接触 8 [4 `; I4 E: o
如果你进行过一年左右的开发,喜欢用eclipse的debug功能。好了,你现在就有阅读源码的技术基础。
$ s1 [4 H( E1 U; ?* s- K+ L7 \我建议从JDK源码开始读起,这个直接和eclipse集成,不需要任何配置。
) D8 O7 R5 O' g) Q0 c, E& j& w. |9 Y( O" ]2 z
可以从JDK的工具包开始,也就是我们学的《数据结构和算法》Java版,如List接口和ArrayList、LinkedList实现,HashMap和TreeMap等。这些数据结构里也涉及到排序等算法,一举两得。
' Q+ V R8 j5 p. l5 b/ L ]面试时,考官总喜欢问ArrayList和Vector的区别,你花10分钟读读源码,估计一辈子都忘不了。
7 g) o0 _* d' v6 F/ c% ~0 ?9 |+ d: c) h9 }
然后是core包,也就是String、StringBuffer等。 0 ~2 r$ Y& J$ }8 D: _( c" I
如果你有一定的Java IO基础,那么不妨读读FileReader等类。我建议大家看看《Java In A Nutshell》,里面有整个Java IO的架构图。Java IO类库,如果不理解其各接口和继承关系,则阅读始终是一头雾水。 + r7 K- v2 G! P( f
Java IO 包,我认为是对继承和接口运用得最优雅的案例。如果你将来做架构师,你一定会经常和它打交道,如项目中部署和配置相关的核心类开发。
8 l+ f3 P" S1 ^% ?3 S5 U: |9 a/ o1 X4 m
读这些源码时,只需要读懂一些核心类即可,如和ArrayList类似的二三十个类,对于每一个类,也不一定要每个方法都读懂。像String有些方法已经到虚拟机层了(native方法),如hashCode方法。
$ k6 @* _+ t7 K+ F* @* u
4 D% f- B8 r- M0 ?( B当然,如果有兴趣,可以对照看看JRockit的源码,同一套API,两种实现,很有意思的。 1 H( K A1 I/ x( W; B1 L
如果你再想钻的话,不妨看看针对虚拟机的那套代码,如System ClassLoader的原理,它不在JDK包里,JDK是基于它的。JDK的源码Zip包只有10来M,它像是有50来M,Sun公司有下载的,不过很隐秘。我曾经为自己找到、读过它很兴奋了一阵。
9 i9 S9 x; ~% W! H- Y6 H. Z7 d, \' }! z
Java Web开发源码
- X4 Y: h9 R' T: ?在阅读Tomcat等源码前,一定要有一定的积累。我的切实体会,也可以说是比较好的阶梯是:
( ~4 }/ }6 O- `0 x, \+ u( E" k, I: ?+ u# m1、写过一些Servlet和JSP代码。注意,不是用什么struts,它是很难接触到Servlet精髓的。用好Struts只是皮毛。
+ a1 V; u3 d: }3 g @7 [: g) f" i/ h2、看过《Servlet和JSP核心编程》
9 d; x( n: t" @3、看过Sun公司的Servlet规范 / S( @& ` B3 m$ m( W# L
4、看过http协议的rfc,debug过http的数据包
9 U* @6 X0 ]/ q9 M) X如果有以上基础,我也不建议你开始读Tomcat源码。我建议你在阅读Tomcat源码前,读过Struts源码,Struts源码比WebWork要简单得多。这个框架是可以100%读懂的,至少WebWork我没有100%读懂。我曾经因为读懂了Struts源码,自己写过一个Web框架。 9 E# J+ r, S- O3 ^
% N; j3 m5 L" }1 t! C/ f _1 W' }
当然,在读Struts框架前,最好看过它的MailReader等demo,非常非常不错的。
( g% T2 \: o4 X i- i \如果你做过一些Struts项目,那么读它时就更得心应手了。
# M6 I/ q0 W5 @4 G- C在读Struts前,建议看看mvnforum的源码,它部分实现了Struts的功能,虽然这个BBS做得不敢恭维。
$ ^* a+ b, H( f/ ^2 G: `5 {
+ L. `9 c% Z2 K$ X: ~如果你读过Struts,再开始考虑Tomcat源码阅读吧。 $ V8 U# W `* R& \4 Z, A
不过,我还是不建议直接读它,先读读onJava网站上的系列文章《How Tomcat Works》吧,它才是Tomcat的最最简易版。它告诉你HttpServletRequest如何在容器内部实现的,Tomcat如何通过Socket来接受外面的请求,你的Servlet代码如何被Tomcat容器调用的(回调)。 3 K2 w2 Y* n3 m" \. [ |% R1 b, T% ]
学习JSP,一定要研读容器将JSP编译后的Servlet源码。 5 @: D5 F( j/ j7 X7 L
为什么我总是称呼Tomcat为容器,而不是服务器?这个疑问留给大家吧。
5 F3 ?/ D; e2 i$ G i* L9 U/ H% r- z; \: v' [) M; D9 ?
如果你一定要读Tomcat,那么就读Jetty吧。至少它是嵌入式,可以直接在eclispe里面设置断点debug。虽然Tomcat也有嵌入式版本。 ( }: s. t- h, L5 p* m4 T0 n8 A
* @7 `0 [' r3 @8 J: q
Java数据库源码阅读 & j& ]2 }. u+ O: l
我建议,先读读Sun的JDBC规范。 3 i% F5 d' [, U$ ^- `) h
我想你一定写过JDBC的代码,那么这时候可以开始阅读源码了。
6 L/ Y1 Y* d1 |8 v+ \如果了解JDBC规范(接口),那么它的实现,JDBC Driver就一定要开始了解,我的建议是,读读mysql的jdbc驱动,因为它开源、设计优雅。在读mysql的JDBC驱动源码时,建议看看mysql的内幕,官方正好有本书,《Mysql Internals》,我五年前读过一部分。比如你可以知道mysql的JDBC驱动,如何通过socket数据包(connect、query),给这个C++开发的mysql服务器交互的。
- J; W# M g9 b( _, D! C0 {: U
& H1 S U# v5 `' ~通过上面的阅读,你可以知道,你的业务代码、JDBC规范、JDBC驱动、以及数据库,它们是如何一起协作的。 ( b4 K( K- R) f. u
如果你了解这些内幕,那么你再学习hibernate、iBatis等持久化框架时,就会得心应手的。 1 ?( H2 K+ Z. \$ Z5 x
' {0 B8 R- p! V+ o7 p; S9 a# F
读过JDBC驱动,那么下一步一定要读读数据库了。而正好有一个强大的数据库是用Java开发的,Hsqldb。它是嵌入式数据库,比如用在桌面客户端软件里,如Mail Client。 $ c, g: {+ h6 ~, r: F1 c( G
我四年前为此写过一篇小文,就不介绍了。
* L/ |4 b: Z5 p' m3 H- w2 i' A9 m2 x; O$ O
Java通讯及客户端软件
7 d+ _% y7 w+ t' ~! d8 q我强烈推荐即时通讯软件wildfire和Spark。你可以把wildfire理解成MSN服务器,Spark理解成MSN客户端。它们是通过XMPP协议通讯的。
- `- } s3 E/ Y: k7 Y$ y q我曾经在一个项目中,定制过Spark,当然也包括服务端的一些改动。所以它们的源码我都读过。 3 b o d3 O8 p' Z5 Z2 R4 u
我之所以推荐它们。是因为: ! F, I- A& j1 x$ w- [0 F& s6 v4 m
1、XMPP够轻量级,好理解 ( r6 m- ^: M7 }( Z# ?8 k
2、学习Socket通讯实现,特别是C/S架构设计
4 v4 e6 A& {4 C& @5 M3、模块化设计。它们都是基于module的,你既可以了解模块化架构,还可以了解模块化的技术支撑:Java虚拟机的ClassLoader的应用场景。 ! b& G$ R2 i' r$ U# I- L
4、Event Driven架构。虽然GUI都是Event驱动的,但Spark的设计尤其优雅
; _0 f/ C: m1 N4 `! z% C- Y$ ], R0 d/ `- L4 I4 n& [5 h* R
这么说吧,读它们的源码,你会为做一名程序员而自豪,因为无论是他们的架构设计还是代码,都太漂亮了。 # D. t4 Y$ g) B% e
4 H ` \' \: V$ r* K$ N
Java企业级应用
) k7 S) ?0 w6 |7 j% H& Y当然了,就是Hibernate、spring这类框架。 0 z+ S1 J v: D0 _
在读Spring源码前,一定要先看看Rod Johnson写的那边《J2EE Design and Development》,它是Spring的设计思路。注意,不是中文版,中文版完全被糟蹋了。
4 u9 k5 n( E8 A. F9 M u; J: w在读Hibernate源码前,一定要读读Gavin King写的那本《Hibernate in Action》,同时,应该再读读Martin Fowler写的《企业应用架构模式》,它专门谈到持久化框架的设计思路。当你觉得这两本书读透了,再去看它们源码吧。
. M1 {* S3 T/ ]+ Y* U( j. F. L而且,在读源码前,你会发现它们用到很多第三方Jar包,二三十个,你最好把那些Jar包先一个个搞明白。 6 I/ _7 Z- P, j. v1 |' ^
: F) q5 z( J6 z/ o. t$ B; S
说到企业应用,一定会涉及到工作流。我当年读过jBPM的源码,网上有介绍jBPM内核的文章(银狐)。我感觉它的内核也就两千行,不要害怕。我曾经阅读jBPM源码的博客。 & Y1 c* D; Q5 v. v: [: T
当然了,读工作流源码,前提是一定要对其理论模型有深入的了解,以及写过一些demo、或做过一些项目。
9 b" W+ P( Q2 d+ r0 Y/ M. p1 Y$ G) A: I5 V7 B$ v
我上面介绍的这些,是我自己读过的,也适合一般人阅读。
7 O/ v. j! C5 ^/ P0 w! O `我也读过一些非Java源码,感觉不错,也推荐给大家:
# U9 ~% q& j: e7 k/ T( xdojo源码 它的架构设计得很优雅,仿Java的import和extends。但实际应用起来一塌糊涂。我们当年基于这个开发了自己的框架,不过我不是主力。
( J. F$ [* |( A3 @
! [* l2 ^; a9 R P; nFlex源码 Flex 08年底刚刚开源后,我就用它做过一个中型项目,应该说是国内的技术先行者。当时市面没有有深度的书,也没有开源项目。我纯粹是看Flex的Help文档和源码,把项目搞定的。两三年过去了,现在觉得系统设计得蛮优雅的。
4 s2 S. x; v# I7 g" g
- R+ d! A4 Z1 l# ?4 u! k: o; C4 b好了,先介绍到这里。 / Y' L% g) I% w: d% g/ i- z0 Q$ X
上面说到的这些Java源码,我都是4年前、甚至更早读过的。技术变化这么快,像互联网的高速发展,催生很多高性能、分布式数据库,如hadoop。我一看,发现自己已经落伍了。
% Z& j2 _4 `. i" @3 t+ B) @) @/ N这几年,想必已经出现了很多优秀的框架,大家不妨分享出来。
6 c* z; z) W/ h ? _' ?3 Q5 f
/ g( J) b; _1 r. s |
|