精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-02-07
前几天我写了《如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件》。昨天和几个朋友讨论问题的时候,谈到通过DaoSupport封装spring-hibernate的时候,是不是需要提供spring和hibernate的所有方法的封装,我认为不可。为什么呢? 1、分层的概念spring对hibernate的封装就是最好的明证。比较sping的HibernateTemplate和hibernate的session我们不难发现,session中的许多方法在HibernateTemplate中都没有,也就是说,spring在封装hibernate的时候,并不是将hibernate的所有方法都提供对应的方法给spring的用户。比如,spring的HibernateTemplate不提供所有hibernate的session中与connection有关的方法,也不提供所有session中与criteria、trasaction有关的方法。Spring为什么不提供这些方法呢?并不是spring不能提供这些方法,而是spring在封装hibernate的时候对更多的关于hibernate进行持久化的这个复杂过程进行了屏蔽,许多在这个过程中的技术细节被进一步封装。当我们在使用spring的封装的时候,就不应当再去考虑hibernate在进行持久化的一些技术细节,因为这已经不是这个层次应当考虑的问题了,或者说这些问题在这个层次上已经透明了。这里就提到了“分层”的概念。这种分层的概念就如同我们的网络分层。众所周知,在网络7层结构中,数据链路层处理的是点对点的通讯传输,它不需要考虑我的通讯传送在什么介质中,这些技术细节是物理层需要考虑的问题。如果一个通讯工程师在设计数据链路层的时候还需要考虑介质的问题,这就不是好的设计。如果在实际设计中真的出现这样的情况,他应当考虑他的设计是不是应当分解,哪部分应当分解到物理层实现,哪部分应当在数据链路层去调用物理层的东西。 2、我们的分层结构我们的软件设计也一样,在这里我们不妨分为hibernate、spring、DaoSupport以及那些Daos四个层次。Hibernate是对JDBC的封装,spring是对Hibernate的封装。当spring在封装hibernate的时候,是不是已经把hibernate的一些技术细节屏蔽。比如,它不再考虑对上层客户提供session、connecion、trasaction了(HibernateTemplate虽然提供了getSession方法,但我们在使用HibernateTemplate通常不会通过getSession得到session以后对session做任何操作,而是在execute方法的内部实现类中使用session)。Critaria和Query也没有提供,甚至没有任何一个方法接受SQL和HQL(你只能在execute方法的内部实现类中使用Critaria、Query、SQL、HQL),因为DAO的思想就是通过对象来处理我们的数据持久化问题。所幸的是,现在hibernate正在向着这方面发展,增删改操作就不必说了,就是关联查询也可以通过值对象的一对一、一对多、多对多关联方便快捷地进行查询。不夸张的说, spring的HibernateTemplate中的常用方法,就可以完成我们90%的工作(除了那些复杂的查询和统计)。 3、DaoSupport的封装DaoSupport是对spring的封装,也就是在spring的HibernateTemplate的基础上做进一步封装。DaoSupport在封装的时候也不需要将HibernateTemplate的所以方法都封装一遍,而是仅仅对常用的方法进行封装,而对于不常用的甚至有可能屏弃的方法不用封装。这样做既可以保证我们的系统结构清晰明了,避免过度设计,又可以保证我们的系统可以在spring的各个版本之间自由切换,增加兼容性。这样做还有一个重要意义在于,它使我们的开发变得简单快捷,我们不再沉溺于spring和hibernate的许多技术问题。我们可以节省出设计DAO的大量时间和精力,更多地去考虑BUS的这种业务逻辑。 以下是我运用这样的体系设计的一个具体的DAO实现的例子,在这个实现中我们完全看不到spring和hibernate的影子,实现也变得非常简单明了: java 代码
|
|
返回顶楼 | |
发表时间:2007-02-08
概念通俗易懂!但是对低偶合的说明似乎不够充分!
我认为Spring 的DaoSupport和HibernateTemplate之间是高偶合的。这么做只是为了简化Dao设计和有针对性锐化s+h的架构! s的低偶合是体现在结构分层上! 比如 有针对的对Hibernate,JDO提供了接口,对于其他的持久层也可以通过jca注入。web mid, bus都有明显的逻辑上的区分! |
|
返回顶楼 | |
发表时间:2007-02-08
也许retreat朋友可以看看我的《如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件》,在这里面我详细描述了我的设计。在这个结构中,DaoSupport是一个接口,它有具体的实现,比如DaoSupportHibernate3Imp,而Daos也不是直接使用DaoSupport,而是通过基础类BasicDao使用DaoSupport。如此结构使得spring的HibernateTemplate与Daos解耦。
|
|
返回顶楼 | |
浏览 4922 次