今天抽空读了下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数据绑定