`
fangang
  • 浏览: 877170 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
311c4c32-b171-3767-b974-d26acf661fb2
谈谈用例模型的那些事儿
浏览量:38658
767c50c5-189c-3525-a93f-5884d146ee78
一次迭代式开发的研究
浏览量:68820
03a3e133-6080-3bc8-a960-9d915ed9eabc
我们应当怎样做需求分析
浏览量:409987
753f3c56-c831-3add-ba41-b3b70d6d913f
重构,是这样干的
浏览量:91641
社区版块
存档分类
最新评论

回复:《如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件》

阅读更多

 

前几天我写了《如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件结构》。昨天和几个朋友讨论问题的时候,谈到通过DaoSupport封装spring-hibernate的时候,是不是需要提供springhibernate的所有方法的封装,我认为不可。为什么呢?

 

1. 分层的概念

springhibernate的封装就是最好的明证。比较spingHibernateTemplatehibernatesession我们不难发现,session中的许多方法在HibernateTemplate中都没有,也就是说,spring在封装hibernate的时候,并不是将hibernate的所有方法都提供对应的方法给spring的用户。比如,springHibernateTemplate不提供所有hibernatesession中与connection有关的方法,也不提供所有session中与criteriatrasaction有关的方法。Spring为什么不提供这些方法呢?并不是spring不能提供这些方法,而是spring在封装hibernate的时候对更多的关于hibernate进行持久化的这个复杂过程进行了屏蔽,许多在这个过程中的技术细节被进一步封装。当我们在使用spring的封装的时候,就不应当再去考虑hibernate在进行持久化的一些技术细节,因为这已经不是这个层次应当考虑的问题了,或者说这些问题在这个层次上已经透明了。这里就提到了“分层”的概念。这种分层的概念就如同我们的网络分层。众所周知,在网络7层结构中,数据链路层处理的是点对点的通讯传输,它不需要考虑我的通讯传送在什么介质中,这些技术细节是物理层需要考虑的问题。如果一个通讯工程师在设计数据链路层的时候还需要考虑介质的问题,这就不是好的设计。如果在实际设计中真的出现这样的情况,他应当考虑他的设计是不是应当分解,哪部分应当分解到物理层实现,哪部分应当在数据链路层去调用物理层的东西。



 

 

 

2. 我们的分层结构

我们的软件设计也一样,在这里我们不妨分为hibernatespringDaoSupport以及那些Daos四个层次。Hibernate是对JDBC的封装,spring是对Hibernate的封装。当spring在封装hibernate的时候,是不是已经把hibernate的一些技术细节屏蔽。比如,它不再考虑对上层客户提供sessionconneciontrasaction了(HibernateTemplate虽然提供了getSession方法,但我们在使用HibernateTemplate通常不会通过getSession得到session以后对session做任何操作,而是在execute方法的内部实现类中使用session)。CritariaQuery也没有提供,甚至没有任何一个方法接受SQLHQL(你只能在execute方法的内部实现类中使用CritariaQuerySQLHQL),因为DAO的思想就是通过对象来处理我们的数据持久化问题。所幸的是,现在hibernate正在向着这方面发展,增删改操作就不必说了,就是关联查询也可以通过值对象的一对一、一对多、多对多关联方便快捷地进行查询。不夸张的说, springHibernateTemplate中的常用方法,就可以完成我们90%的工作(除了那些复杂的查询和统计)。

 

3. DaoSupport的封装

DaoSupport是对spring的封装,也就是在springHibernateTemplate的基础上做进一步封装。DaoSupport在封装的时候也不需要将HibernateTemplate的所以方法都封装一遍,而是仅仅对常用的方法进行封装,而对于不常用的甚至有可能屏弃的方法不用封装。这样做既可以保证我们的系统结构清晰明了,避免过度设计,又可以保证我们的系统可以在spring的各个版本之间自由切换,增加兼容性。这样做还有一个重要意义在于,它使我们的开发变得简单快捷,我们不再沉溺于springhibernate的许多技术问题。我们可以节省出设计DAO的大量时间和精力,更多地去考虑BUS的这种业务逻辑。

 

以下是我运用这样的体系设计的一个具体的DAO实现的例子,在这个实现中我们完全看不到spring和hibernate的影子,实现也变得非常简单明了:

 

 

package com.htxx.thps.psb.dao.imp;    
import com.htxx.service.dao.BasicDao;    
import com.htxx.service.dao.Condition;    
import com.htxx.service.dao.ResultSet;    
import com.htxx.thps.model.PsPsb;    
import com.htxx.thps.model.PsPsjcd;    
import com.htxx.thps.model.PsWtmx;    
import com.htxx.thps.psb.dao.PsbDao;    

/**   
* @author FanGang   
*/   
public class PsbDaoImp extends BasicDao implements PsbDao {    

    /* (non-Javadoc)   
     * @see com.htxx.thps.psb.dao.PsbDao#getPsb(java.lang.String)   
     */   

    public PsPsb getPsb(String id) {    
        return (PsPsb)this.load(PsPsb.class, id);    
    }    

    /* (non-Javadoc)   
     * @see com.htxx.thps.psb.dao.PsbDao#updatePsb(com.htxx.thps.model.PsPsb)   
     */   
    public void updatePsb(PsPsb vo) {    
        this.update(vo);    
    }       

    /* (non-Javadoc)   
     * @see com.htxx.thps.psb.dao.PsbDao#getPsb(com.htxx.service.dao.Condition)   
     */   

    public ResultSet getPsb(Condition condition) {    
        return this.query("PsPsb", condition);    
    }    

    public PsPsjcd getPsjcd(String id) {    
        return (PsPsjcd)this.load(PsPsjcd.class, id);    
    }    
   
    public ResultSet getPsjcd(Condition condition) {    
        return this.query("PsPsjcd", condition);    
    }    
   
    public PsWtmx getWtmx(String id) {    
        return (PsWtmx)this.load(PsWtmx.class, id);    
    }    
   
    public ResultSet getWtmx(Condition condition) {    
        return this.query("PsWtmx", condition);    
    }    
   
    public void updatePsjcd(PsPsjcd vo) {    
        this.update(vo);    
    }    
   
    public void updateWtmx(PsWtmx vo) {    
        this.update(vo);    
    }    
   
}   
  
4. DaoSupport的适应范围 

 

DaoSupport是对spring的封装,spring是对hibernate的封装。从整个体系结构我们不难得出结论,DaoSupport只适用于采用DAO的方式进行数据持久化的应用。其它非DAO的应用,比如使用JDBC直接执行SQL,或者执行创建数据库、创建表空间等操作,都不在DaoSupport的适用范围内。

 

 5. 如何解决其它问题

但是,我们的开发肯定会遇到使用DaoSupport解决不了的问题,比如我要执行复杂的查询,我要使用SQLHQL。当我们需要使用SQLHQL,甚至我们还要使用session执行一些操作的时候,我们的代码就应当处于我们体系结构的spring同级甚至更低的层次结构上了,就不应当使用DaoSupport,而是根据所写的代码将其放到合理的层次上实现。有的代码可能还会跨越多个层次。比如如果我要使用许多Oracle独有的函数实现一个功能,这些方法可以应用在Oracle数据库中,却不能应用在其它数据库中,那么我是不是应当有一个不考虑具体数据库的应用层以及它对这种数据库的实现层。有的问题不在DaoSupport的应用范围,比如我们使用JDBC直接执行SQL语句,显然不在范围之内,是不是应当把它交给与DaoSupport在同一层次的JDBCSupport,封装springJdbcTemplate

 

总之,DaoSupport是对springHibernateTemplate的封装(假如我们采用spring+hibernate的技术框架),它适用于采用DAO的方式进行数据持久化的应用,解决的是采用继承的方式带来的对springhibernate具体技术框架的依赖。我在《如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件结构》中已经给出了这个结构的一个实现,供大家参考.

 

 

 

 

 

  • 大小: 61.4 KB
分享到:
评论
2 楼 fangang 2007-02-08  
也许retreat朋友可以看看我的《如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件》,在这里面我详细描述了我的设计。在这个结构中,DaoSupport是一个接口,它有具体的实现,比如DaoSupportHibernate3Imp,而Daos也不是直接使用DaoSupport,而是通过基础类BasicDao使用DaoSupport。如此结构使得spring的HibernateTemplate与Daos解耦。
1 楼 retreat 2007-02-08  
概念通俗易懂!但是对低偶合的说明似乎不够充分!

我认为Spring 的DaoSupport和HibernateTemplate之间是高偶合的。这么做只是为了简化Dao设计和有针对性锐化s+h的架构!

s的低偶合是体现在结构分层上! 比如 有针对的对Hibernate,JDO提供了接口,对于其他的持久层也可以通过jca注入。web mid, bus都有明显的逻辑上的区分!

相关推荐

    如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件

    在IT行业中,构建一个低耦合、高内聚的软件架构是至关重要的,因为它能确保系统的可维护性、可扩展性和灵活性。Struts、Spring和Hibernate是Java领域中三个非常著名的开源框架,它们分别在MVC(Model-View-...

    Struts+Spring+Hibernate+WebService集成架构.doc

    整个过程中,各层通过定义清晰的接口进行交互,确保了系统的松耦合和高内聚。 综上所述,Struts+Spring+Hibernate+WebService集成架构通过合理的分层设计,充分利用了各框架的优势,构建出了一个既高效又灵活的企业...

    Struts+hibernate+spring框架

    在请求处理过程中,Spring将负责创建和配置这些对象,从而实现了解耦合和高内聚的设计原则。 在MySQL作为数据库的情况下,SSH整合通常会涉及以下步骤: 1. **环境配置**:安装并配置JDK、Apache Tomcat服务器、...

    Struts+Spring+Hibernate+Freemarker新闻系统

    6. **整合应用优势**: 将Struts、Spring、Hibernate和Freemarker整合在一起,可以实现松耦合、高内聚的设计,提高代码的可维护性和可扩展性。此外,这四个框架都有丰富的社区支持和强大的功能,可以应对复杂的应用...

    struts+hibernate+spring集成教程

    6. **优势与最佳实践**:集成Struts、Hibernate和Spring可以实现松耦合、高内聚的设计,提高开发效率。在实际项目中,我们应遵循模块化、分层设计的原则,合理划分各层职责,并注意性能优化,如缓存策略、事务隔离...

    项目实践精解:基于Struts-Spring-Hibernate的Java应用开发

    在基于Struts-Spring-Hibernate的Java应用开发中,项目架构的设计遵循了MVC(Model-View-Controller)模式与分层架构理念,确保各组件间的低耦合和高内聚。这种架构将应用程序分为表示层(Presentation Layer)、...

    jar包(struts2.0.8+spring2.0+hibernate3.2)

    这个压缩包“struts2.0.8+spring2.0+hibernate3.2”包含了这三个框架的特定版本,这将帮助开发者在构建基于Java的企业级应用程序时快速搭建环境。 **Struts2** 是一个用于构建企业级Web应用程序的开源MVC框架,它...

    struts+hibernate+spring开发实例

    在这个过程中,不仅深入了解了每一层的作用和实现原理,还学习了如何通过这些技术框架来构建一个高内聚低耦合的应用程序。这种分层设计的思想对于未来开发复杂的企业级应用具有重要意义。 此外,实验还展示了如何...

    做struts2.0+spring+hibernate项目使用的jar包

    通过合理的配置和编程,可以构建出松耦合、高内聚的系统架构。 总的来说,Struts2.0+Spring+Hibernate的组合为Java Web开发提供了一个强大的解决方案,它可以帮助开发者快速地构建出健壮的、模块化的应用,同时也为...

    会员管理系统(struts+hibernate+spring)

    SSH框架结合使用,可以实现松耦合、高内聚的代码结构,提高开发效率和代码可维护性。同时,通过Spring的事务管理,保证了数据操作的原子性和一致性,提升了系统的稳定性。 综上所述,"会员管理系统(struts+...

    开发者突击 struts2+Spring+Hibernate 整合开发 投票管理系统

    这种整合能够充分利用各个框架的优势,实现松耦合、高内聚的设计,提高开发效率和代码质量。 首先,Struts2作为前端控制器,接收HTTP请求,解析用户输入,并调用相应的业务逻辑。它的拦截器机制使得我们可以添加...

    车辆管理系统(struts+hibernate+spring+oracle)130225.zip

    5. 整合框架:将Struts、Hibernate和Spring整合在一起,可以实现松耦合和高内聚的设计,提高系统的灵活性和可维护性。Spring可以管理和协调其他两个框架,使得业务逻辑和数据访问更加独立,同时也降低了系统的复杂性...

    Struts+Hibernate+Spring实现的人力资源管理系统

    此外,Spring的集成能力使得Struts和Hibernate能无缝配合,构建出松耦合、高内聚的系统架构。 除了技术选型,本系统还包含了需求文档、数据库设计文档以及需求讲演PPT,这些都是项目开发的关键组成部分。需求文档...

    Spring+struts+hibernate 的 SSH教程

    SSH框架组合使用,可以实现松耦合、高内聚的代码结构,提高开发效率,便于团队协作和后期维护。同时,SSH提供了一套完整的解决方案,覆盖了从用户请求到数据持久化的整个流程。 总结,SSH教程是一个为初学者准备的...

    会员管理系统(struts+hibernate+spring).zip

    Struts处理用户交互,Hibernate负责数据存储,Spring则协调整个系统的运行,形成了一种松耦合、高内聚的架构。这样的设计不仅提高了开发效率,还降低了系统维护和扩展的成本。 在实际开发中,会员管理系统可能包括...

Global site tag (gtag.js) - Google Analytics