今天抽空讀了下hibernate源碼,總結了幾條讀源碼的經驗,並且認識了hibernate的部分源碼結構。
首先,拿到一個框架,要先了解其基本功能,通讀(略讀)其API。
然后,通過其主要代碼或其在項目中的常應用的類為入口,進行追蹤。看看其實如何實現本功能的。同時,可在網上查找相關
文檔,了解其基本架構。
在對其常用功能的實現有一定認識以后,然后通視源碼,主要先從其工具類或實體類開始(因為易於理解,並且不像其他邏輯相關的類一樣較為復雜)。
在閱讀邏輯相關的類時,不僅要'見文知意',還要仔細閱讀注釋,如果有Log日志輸出,還可以借助日志輸出字符來理解(在應用中還可以借助控制台日志打印信息來追蹤程序執行過程)。沿着某項功能的實現為主線,跳躍式閱讀。
最后,查缺補漏,找出還未閱讀的代碼(如不想深入研究,就不必了)。
**在此發現了'解耦'的好處,不用把整個框架設計為一體,全部互相依賴,比如Hibernate里的一些工具類(如StringHelper類),這樣在修改重構時會減少代碼量。
今天只讀了configuration類和相關的部分類元源碼。
其中configuration類是Hibernate運行時的第一個類,他負責解析hibernate.cfg.xml,並作完成框架的初始化工作。
下面是引用網上關於Hibernate各包的簡介。
1. org.hibernate :該包的類基本上都是接口類和異常類
2. org.hibernate.cache.* :cache的實現類
3. org.hibernate.cfg.* :配置文件讀取類
4. org.hibernate.collection.* :Hibernate集合接口實現類:例如List(PersistentList),Set(PersistentSet), Bag(PersistentBag)等等,Hibernate之所以要自行編寫集合接口實現類是為了支持延遲加載。
5. org.hibernate.connection.* :幾個數據庫連接池的Provider
6. org.hibernate.dialect.* :支持多種數據庫特性,每個Dialect實現類代表一種數據庫,描述了該數據庫支持的數據類型和其它特點,例如是否有AutoIncrement,是否有Sequence,是否有分頁sql等等
7. org.hibernate.eg.* :Hibernate文檔中用到的例子
8. org.hibernate.engine.* :這個包的類作用比較散
9. org.hibernate.hql.* :HQL的實現org.hibernate.id.* :ID生成器
10. orghibernate.impl.* :最核心的包,一些重要接口的實現類,如果Session,SessionFactory,Query等
11. org.hibernate.jca.* :JCA支持,把Session包裝為支持JCA的接口實現類
12. org.hibernate.jmx.* :jmx的實現
13. org.hibernate.loader.* :也是很核心的包,主要是生成sql語句的
14. org..hibernate.lob.* :Blob和Clob支持
15. org.hibernate.mapping.* :hbm文件的屬性實現
16. org.hibernate.metadata.*:PO的Meta實現
17. org.hibernate.odmg.*:ODMG是一個ORM標准,這個包是ODMG標准的實現類
18. org.hibernate.persister.*:核心包,實現持久對象和表之間的映射
19. org.hibernate.proxy.*:Proxy和Lazy Loading支持
20. org.hibernate.ps.*:該包是PreparedStatment Cache
21. org.hibernate.sql.*:生成JDBC sql語句的包
22. org.hibernate.test.*:測試類,你可以用junit來測試Hibernate
23. org.hibernate.tool.hbm2ddl.*:用hbm配置文件生成DDL
24. org.hibernate.transaction.*:Hibernate Transaction實現類
25. org.hibernate.type.*:Hibernate中定義的持久對象的屬性的數據類型
26. org.hibernate.util.*:一些工具類,作用比較散
27. org.hibernate.xml.*:XML數據綁定