如何學習源碼

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、或作過一些項目。編程

相關文章
相關標籤/搜索