1、程序员的层次划分(本文只针对学习源码部分)
一、只关注项目自己,不懂就baidu一下。
二、除了作好项目,还会阅读和项目有关的技术书籍,看wikipedia。
三、找一些开源项目看看,大量试用第三方框架,还会写写demo。 (要解决什么问题?如何实现的?)
最适合看源码的就是,你对完成一个功能感兴趣,因此你想要了解他。
好比说Mybatis,你想了解他的代码生成机制,本身先去思考,若是是你作,该怎么作,再去看源码。
再好比说Log4j.打日志的时候是异步的吗?若是我须要把日志打到另一台机器上,我该怎么作?
带着这些问题去思考解决方案。那么天底下的源码都是你的老师。千万别东一锤子西一锤子的去瞎看。
四、阅读基础框架、J2EE规范、Debug服务器内核。
2、源码学习
一、Java源码初接触
在eclipse中加入jdk源码
(1)点 “window“-> “Preferences”-> “Java” -> “Installed JRES”;
(2)此时"Installed JRES"右边是列表窗格,列出了系统中的JRE 环境,选择你的JRE,而后点边上的“Edit...“, 会出现一个窗口(Edit JRE) ;
(3)选中rt.jar文件的这一项:“C:\Java\jdk1.5.0_04\jre\lib\rt.jar” 点 左边的“+”号展开它(JDK实际安装路径以你的为准);
(4)展开后,能够看到“Source Attachment:(none)”,点这一项,点右边的按钮“Source Attachment...“,选择你的JDK目录下的 “src.zip”文件;
(5)一路点“ok”结束。
能够从JDK的util包开始,也就是咱们学的《数据结构和算法》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 包,我认为是对继承和接口运用得最优雅的案例。若是你未来作架构师,你必定会常常和它打交道,如项目中部署和配置相关的核心类开发。
二、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,再开始考虑Tomcat源码阅读吧。
不过,仍是不建议直接读它,先读读onJava网站上的系列文章《How Tomcat Works》吧,它才是Tomcat的最最简易版。
它告诉你HttpServletRequest如何在容器内部实现的,Tomcat如何经过Socket来接受外面的请求,你的Servlet代码如何被Tomcat容器调用的(回调)。
学习JSP,必定要研读容器将JSP编译后的Servlet源码。 mysql
三、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等持久化框架时,就会驾轻就熟的。
四、Java通信及客户端软件
推荐即时通信软件wildfire和Spark。你能够把wildfire理解成MSN服务器,Spark理解成MSN客户端。它们是经过XMPP协议通信的。
我之因此推荐它们。是由于:
(1)XMPP够轻量级,好理解
(2)学习Socket通信实现,特别是C/S架构设计
(3)模块化设计。它们都是基于module的,你既能够了解模块化架构,还能够了解模块化的技术支撑:Java虚拟机的ClassLoader的应用场景。
(4)Event Driven架构。虽然GUI都是Event驱动的,但Spark的设计尤为优雅
五、Java企业级应用
在读Spring源码前,必定要先看看Rod Johnson写的那边《J2EE Design and Development》,它是Spring的设计思路。注意,不是中文版,中文版彻底被糟蹋了。 程序员
“为何要有这样的架构”,“他是什么样子的”,“他是怎么工做的”。 面试
IoC容器存在的缘由在于对象的解耦,简单来讲就是咱们本身定义咱们要怎么去实现对象中调用的接口。咱们作的不就是容器嘛(用新的方式来管理类,那就是容器),咱们就定义一个读文件的方法,而后把读到的内容用加载器进行加载,而后放在一个容器里面,名字对应Object,而后开始注入了,咱们定义了注入类的位置和被注入类的位置(约定优于配置),咱们就去容器中获取。算法
ApplicationContext ct=new ClassPathXmlApplicationContext("applicationContext01.xml"); ct.getBean("");sql
ClassPathXmlApplicationContext这是东东是咱们用来读文件的,能够读配置的文件的类不可胜数,只取一个分析,足矣。
ClassPathXmlApplicationContext这个东东,咱们能够追踪他的祖先,AbstractXmlApplicationContext、AbstractRefreshableConfigApplicationContext、AbstractRefreshableApplicationContext、AbstractApplicationContext、DefaultResourceLoader、ResourceLoader,这么多类,通常只读第一个和最后一个,老祖先能够知道它的根基,
public interface ResourceLoader {
String CLASSPATH_URL_PREFIX = "classpath:";
Resource getResource(String var1);
ClassLoader getClassLoader();
}shell
很明显啊,老祖先ResourceLoader 就是干了这么三件事嘛,定义了加载地址,第二,定义了资源加载的方法,第三,定义了类加载器。
咱们来看下一个重要的类吧。那就是getBean()接口提供类。(ctrl+鼠标左键进入)
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String var1) throws BeansException;
<T> T getBean(String var1, Class<T> var2) throws BeansException;
<T> T getBean(Class<T> var1) throws BeansException;
Object getBean(String var1, Object... var2) throws BeansException;
<T> T getBean(Class<T> var1, Object... var2) throws BeansException;
boolean containsBean(String var1);
boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;
boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;
Class<?> getType(String var1) throws NoSuchBeanDefinitionException;
String[] getAliases(String var1);
}
BeanFactory 很明显就是类的工厂。咱们的Resource通过ResourceLoader的调和,用ClassLoader加载,最后变成了BeanFactory。这又是一个粗路线了。
咱们想一想资源是否是都须要定义和约束,因而有了BeanDefinition,咱们须要封装,因而有了各类**wrapper。
咱们再来想一想细节吧,好比说循环注入问题,A引用B,B引用A,那么怎么吧,那不是循环插入到爆炸?那么Spring是怎么实现的。
咱们越想越多,愈来愈有一种感受就是,也许那么一刻,那些编程大师,那时候也和你同样这样低头沉思。保持这样的思考,画图,擦涂,重构,最后就是一个能和别人说的思想(架构)。
在读Hibernate源码前,必定要读读Gavin King写的那本《Hibernate in Action》,同时,应该再读读Martin Fowler写的《企业应用架构模式》,它专门谈到持久化框架的设计思路。数据库
当你以为这两本书读透了,再去看它们源码吧。 并且,在读源码前,你会发现它们用到不少第三方Jar包,二三十个,你最好把那些Jar包先一个个搞明白。
说到企业应用,必定会涉及到工做流。读工做流源码,前提是必定要对其理论模型有深刻的了解,以及写过一些demo、或作过一些项目。编程