该用户从未签到
|
源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心。 & J1 N7 z. H7 a9 j; O i7 e
' @ B- |. I0 s0 c* Z0 e说到技术基础,我打个比方吧,如果你从来没有学过java,或是任何一门编程语言如C++,一开始去啃《Core Java》,你是很难从中吸收到营养的,特别是《深入Java虚拟机》这类书,别人觉得好,未必适合现在的你。 ' a; |2 S; t/ e* G, z* U2 G
虽然Tomcat的源码很漂亮,但我绝不建议你一开始就读它。我文中会专门谈到这个,暂时不展开。 , u- u- [) u' a0 a+ R3 F& Z1 [) s
4 |& b! c6 S( |% P# ^$ o
强烈的求知欲,我认为是阅读源码的最核心驱动力。我见到绝大多数程序员,对学习的态度,基本上就是这几个层次(很偏激哦):
0 Q" L9 b7 F# k% \1、只关注项目本身,不懂就baidu一下。 D7 o+ J8 E: z3 ]0 r' K# Z
2、除了做好项目,还会阅读和项目有关的技术书籍,看wikipedia。
0 ]; P* Y# c' G$ s3、除了阅读和项目相关的书外,还会阅读IT行业的书,比如学Java时,还会去了解函数语言,如LISP。 $ Y: v# Q" g/ }
4、找一些开源项目看看,大量试用第三方框架,还会写写demo。 # |8 B+ g5 X' H/ V! C# ~4 S
5、阅读基础框架、J2EE规范、Debug服务器内核。 + ?' q& R: U7 v" a
( J. }0 T' Z* F8 \% |% ?0 d大多数程序都是第1种,到第5种不光需要浓厚的兴趣,还需要勇气:我能读懂吗?其实,你能够读懂的。
" L$ e; d) V; T6 s& w9 J2 v/ V( v, T& `
耐心,真的很重要。因为你极少看到阅读源码的指导性文章或书籍,也没有人要求或建议你读。你读的过程中经常会卡住,而一卡主可能就陷进了迷宫。这时,你需要做的,可能是暂时中断一下,再从外围看看它:如API结构、框架的设计图。 1 t+ {, m. M: |
: u6 ?+ o! u, t9 a; N# n0 [( c
我就说说如何读java源码,以及我曾经的阅读感悟。
0 P& P3 K6 d+ l& S) u$ E5 w3 D% p7 e8 p
Java源码初接触 2 r- O, t4 v- `! `1 v' ]
如果你进行过一年左右的开发,喜欢用eclipse的debug功能。好了,你现在就有阅读源码的技术基础。
* m# o, _) Z$ }/ x4 G我建议从JDK源码开始读起,这个直接和eclipse集成,不需要任何配置。 / v- s; o7 Y& y* Q# y$ E' O' b
) q1 }" X9 f& j+ t% z6 k9 r可以从JDK的工具包开始,也就是我们学的《数据结构和算法》Java版,如List接口和ArrayList、LinkedList实现,HashMap和TreeMap等。这些数据结构里也涉及到排序等算法,一举两得。 0 C2 P1 k# M* V) v! ~5 g
面试时,考官总喜欢问ArrayList和Vector的区别,你花10分钟读读源码,估计一辈子都忘不了。 - [/ p* Q' \" g. t5 J1 o: p5 j1 Z" s
) R+ m3 x h' q& Z
然后是core包,也就是String、StringBuffer等。 2 r1 v: }2 [ S, Z3 ]# S
如果你有一定的Java IO基础,那么不妨读读FileReader等类。我建议大家看看《Java In A Nutshell》,里面有整个Java IO的架构图。Java IO类库,如果不理解其各接口和继承关系,则阅读始终是一头雾水。 ; z! R: _( c* h' z
Java IO 包,我认为是对继承和接口运用得最优雅的案例。如果你将来做架构师,你一定会经常和它打交道,如项目中部署和配置相关的核心类开发。
4 w. c& ?) N1 n
. i( G" B& F ^2 \/ x读这些源码时,只需要读懂一些核心类即可,如和ArrayList类似的二三十个类,对于每一个类,也不一定要每个方法都读懂。像String有些方法已经到虚拟机层了(native方法),如hashCode方法。
% K% z4 R8 K, {5 n: W/ S0 v- C6 k6 s$ Y R
: I" ]% ]2 x1 v, b& Q. G9 l- f" H当然,如果有兴趣,可以对照看看JRockit的源码,同一套API,两种实现,很有意思的。
: z+ K) h9 X4 d% j) Q2 T6 Q如果你再想钻的话,不妨看看针对虚拟机的那套代码,如System ClassLoader的原理,它不在JDK包里,JDK是基于它的。JDK的源码Zip包只有10来M,它像是有50来M,Sun公司有下载的,不过很隐秘。我曾经为自己找到、读过它很兴奋了一阵。 / f3 o5 j3 I9 Y0 l- ]5 B! d
1 n: A0 G* G8 Y2 t
Java Web开发源码
3 w' \/ H v: L9 {+ a在阅读Tomcat等源码前,一定要有一定的积累。我的切实体会,也可以说是比较好的阶梯是: . ], U2 \3 a" \3 \6 G. r
1、写过一些Servlet和JSP代码。注意,不是用什么struts,它是很难接触到Servlet精髓的。用好Struts只是皮毛。 1 E- e% q6 o/ j1 z7 l
2、看过《Servlet和JSP核心编程》
' H" l Z, y G u* r {6 u3、看过Sun公司的Servlet规范
# @+ e- `2 h8 N k8 V4、看过http协议的rfc,debug过http的数据包 3 R" u3 S; @& G# L/ o/ S
如果有以上基础,我也不建议你开始读Tomcat源码。我建议你在阅读Tomcat源码前,读过Struts源码,Struts源码比WebWork要简单得多。这个框架是可以100%读懂的,至少WebWork我没有100%读懂。我曾经因为读懂了Struts源码,自己写过一个Web框架。 + R9 [4 X8 m6 A. f* }
' m/ |0 K' r# C8 S, z J
当然,在读Struts框架前,最好看过它的MailReader等demo,非常非常不错的。 / G: I& e3 O, [$ _% {; L1 A0 \
如果你做过一些Struts项目,那么读它时就更得心应手了。 5 [% I# s6 i- r4 }5 ]* K# b5 F( h
在读Struts前,建议看看mvnforum的源码,它部分实现了Struts的功能,虽然这个BBS做得不敢恭维。 3 o, C! Q' S" E! t* v
- b7 d- G8 J: N. h5 k
如果你读过Struts,再开始考虑Tomcat源码阅读吧。
1 P% d3 z4 B, b* n' P+ u( H不过,我还是不建议直接读它,先读读onJava网站上的系列文章《How Tomcat Works》吧,它才是Tomcat的最最简易版。它告诉你HttpServletRequest如何在容器内部实现的,Tomcat如何通过Socket来接受外面的请求,你的Servlet代码如何被Tomcat容器调用的(回调)。 8 @; ?) D/ q& \
学习JSP,一定要研读容器将JSP编译后的Servlet源码。 ' B# A6 y* e; l: V" j0 `
为什么我总是称呼Tomcat为容器,而不是服务器?这个疑问留给大家吧。
( @2 L' j; i' s% e" q7 M
9 e- F9 Z+ n5 \3 K2 E如果你一定要读Tomcat,那么就读Jetty吧。至少它是嵌入式,可以直接在eclispe里面设置断点debug。虽然Tomcat也有嵌入式版本。 4 L6 W' f9 k7 N1 ^
/ f$ w& R5 u/ W+ R+ k
Java数据库源码阅读 ) Y4 H: C# ]$ m) ]' b2 u
我建议,先读读Sun的JDBC规范。 7 Z. J; B. O- e' e
我想你一定写过JDBC的代码,那么这时候可以开始阅读源码了。
9 v& @6 d$ p3 a# \) q) [如果了解JDBC规范(接口),那么它的实现,JDBC Driver就一定要开始了解,我的建议是,读读mysql的jdbc驱动,因为它开源、设计优雅。在读mysql的JDBC驱动源码时,建议看看mysql的内幕,官方正好有本书,《Mysql Internals》,我五年前读过一部分。比如你可以知道mysql的JDBC驱动,如何通过socket数据包(connect、query),给这个C++开发的mysql服务器交互的。 6 F7 N% e8 M9 X0 b* n
& g% r b( v' o/ [
通过上面的阅读,你可以知道,你的业务代码、JDBC规范、JDBC驱动、以及数据库,它们是如何一起协作的。
9 i |+ J+ w0 X如果你了解这些内幕,那么你再学习hibernate、iBatis等持久化框架时,就会得心应手的。
2 B! X; b) R% \1 X; D' Y: g1 [8 z K+ @$ l
读过JDBC驱动,那么下一步一定要读读数据库了。而正好有一个强大的数据库是用Java开发的,Hsqldb。它是嵌入式数据库,比如用在桌面客户端软件里,如Mail Client。 , i5 O6 A* k* S& b- Q9 G' J' X" E
我四年前为此写过一篇小文,就不介绍了。 ! T% l0 ^* |: o; o- D3 z
q' |$ ]6 W! Q( |. B0 PJava通讯及客户端软件
* G! F# s& X3 P) I3 n; `2 A, l我强烈推荐即时通讯软件wildfire和Spark。你可以把wildfire理解成MSN服务器,Spark理解成MSN客户端。它们是通过XMPP协议通讯的。
) I$ W2 k2 _* ~1 J) Q8 Q/ W. g我曾经在一个项目中,定制过Spark,当然也包括服务端的一些改动。所以它们的源码我都读过。
' m6 T. M% ^; |' m7 N5 f我之所以推荐它们。是因为:
+ y# j/ ~: i* G3 g& |1、XMPP够轻量级,好理解 7 Y o& Q. N4 ^5 u* `6 p& }- `
2、学习Socket通讯实现,特别是C/S架构设计 ' t3 {9 p; G3 p$ u: b
3、模块化设计。它们都是基于module的,你既可以了解模块化架构,还可以了解模块化的技术支撑:Java虚拟机的ClassLoader的应用场景。
( k' }+ [0 R$ T% v& E( T4、Event Driven架构。虽然GUI都是Event驱动的,但Spark的设计尤其优雅 2 u7 M9 T* `0 F% b3 \) Z8 t
: ^- S( |% O6 r- Y3 k' v' z1 Z6 C
这么说吧,读它们的源码,你会为做一名程序员而自豪,因为无论是他们的架构设计还是代码,都太漂亮了。
% }5 l6 M, y1 R; w/ r1 D a+ [ _4 d7 \" r. U; z# c
Java企业级应用 ( b6 A+ J, N5 g+ \1 s' e* z0 G+ r$ |
当然了,就是Hibernate、spring这类框架。
; L3 q! t1 {( ]$ j9 \& D在读Spring源码前,一定要先看看Rod Johnson写的那边《J2EE Design and Development》,它是Spring的设计思路。注意,不是中文版,中文版完全被糟蹋了。
% v+ [9 W& j& K9 R2 _, Y$ A在读Hibernate源码前,一定要读读Gavin King写的那本《Hibernate in Action》,同时,应该再读读Martin Fowler写的《企业应用架构模式》,它专门谈到持久化框架的设计思路。当你觉得这两本书读透了,再去看它们源码吧。 z% C. P% ~1 f2 d2 z$ ^1 N
而且,在读源码前,你会发现它们用到很多第三方Jar包,二三十个,你最好把那些Jar包先一个个搞明白。
2 m3 H z: Z% T
S+ {- F. |* P7 Q) \说到企业应用,一定会涉及到工作流。我当年读过jBPM的源码,网上有介绍jBPM内核的文章(银狐)。我感觉它的内核也就两千行,不要害怕。我曾经阅读jBPM源码的博客。
0 X$ g: @/ m6 ?/ ~$ Q' e& w当然了,读工作流源码,前提是一定要对其理论模型有深入的了解,以及写过一些demo、或做过一些项目。
# C. Z/ F# u" T9 Y% P- U( e
9 j7 @& j2 s) F7 Q' P" w我上面介绍的这些,是我自己读过的,也适合一般人阅读。
, M: W1 |" |& {6 z2 [/ [' b我也读过一些非Java源码,感觉不错,也推荐给大家:
- S2 E* T3 p* f. Q7 k: w0 q/ c5 ^dojo源码 它的架构设计得很优雅,仿Java的import和extends。但实际应用起来一塌糊涂。我们当年基于这个开发了自己的框架,不过我不是主力。 ( b- \7 W+ W0 h
1 g' A& f( q& `: sFlex源码 Flex 08年底刚刚开源后,我就用它做过一个中型项目,应该说是国内的技术先行者。当时市面没有有深度的书,也没有开源项目。我纯粹是看Flex的Help文档和源码,把项目搞定的。两三年过去了,现在觉得系统设计得蛮优雅的。 . G9 i! l; T1 }" z
2 A' s, E. t F* X$ j2 S好了,先介绍到这里。
1 v. ~8 x8 K- S# _9 T, ~: E上面说到的这些Java源码,我都是4年前、甚至更早读过的。技术变化这么快,像互联网的高速发展,催生很多高性能、分布式数据库,如hadoop。我一看,发现自己已经落伍了。 & k( o" ]/ t* w
这几年,想必已经出现了很多优秀的框架,大家不妨分享出来。
6 M+ U, n4 p& M5 V6 M8 w1 y$ U/ J& z1 N6 W
|
|