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

问题的提出

分析与决策



1.       编写DAO的时候不要直接去使用hibernate或spring对hibernate的支持。
现在我们在编写 DAO的时候普遍都是直接继承 spring对 hibernate的封装类 HibernateDaoSupport,然后使用该类提供的诸如 等等。另外,在使用 方法实现一些更复杂的 hibernate功能的时候还会使用 hibernate的类,诸如 Query, Session, Type等。这样直接使用 spring和 hibernate的类存在的问题在于,你的代码将不得不依赖与 spring和 hibernate的某个版本。比如说,现在 hibernate3出来了,改动挺大,实际上最要命的是包结构, hibernate2的包结构是 ,然而 hibernate3是 。同样, spring为了支持 hibernate3,包名也改为 。假如,你现在新开发一个项目,这没什么关系,如果是升级一个项目问题就来了。如果你希望将你的一个项目从 hibernate2升级为 hibernate3,你不得不修改 DAO中所有对 hibernate和 spring-hibernate的引用。如果你的代码中出现 hibernate2与 hibernate3不兼容的方法和类,比如 (在 hibernate3中已经没有了) ,你还将不得不改写。那么你可能会说,我不会这样升级。如果你的软件生命周期有好多年, hibernate升级到 4,升级到 5,你还是依然使用 hibernate2?如果你以这种方式开发一个平台,你能要求所有使用你平台的软件项目都只能使用 hibernate2?更进一步说,我现在开发一个产品,今后的客户将是成千上万。经过 1、 2年我需要升级了,这时我的升级包有几十 M,几乎把所有的 DAO都换了个遍,这样的升级无异于重装。也许,有人会提出另一个方案,在 HibernateDaoSupport与 DAO中间增加了一个基础类,这样将基础类中的 ,改为了 ,这样其下面继承的 DAO就不用改动了。然而在源码上是小小的改动,但对于类来说,两个不同版本的 其相关的属性和方法还是有不少变化,那么在基础类重新编译的同时,你的继承类重新编译否。既然已经重新编译了,因此你的所有 DAO在升级的时候依然要打入升级包,问题依然存在。
以上问题,究其原因,是我们项目中的 DAO依赖于 hibernate和 spring,因为我们对它们的使用是继承,是一种很强的关联,就是一种依赖。我们只需要稍微进行一些调整,就可以解决这个问题,那就是不使用直接继承,而使用接口进行分离。可以使用 Façade模式,先建立一个叫 BasicDao的基础类,从名称我们可以看出,它是所有 DAO的基础类,实现 DAO操作所需的所有诸如 、 、 、 等方法,除了一些基本的方法,诸如翻页查询、 getCount、解析查询条件形成 HQL语句等功能也在这里实现,但是不要使用与 hibernate或 spring有关的任何方法和类。同时, BasicDao调用一个叫 DaoSupport的接口, DaoSupport的接口则是提供持久化所需的基本方法,最原始的元素。然后,我为 DaoSupport接口提供各种不同的实现,比如 hibernate2的实现 DaoSupportHibernateImp、 hibernate3的实现 DaoSupportHibernate3Imp,整个结构如下图所示。 BasicDao可以使用 hibernate或 spring提供的方法,但是不是直接使用,而是通过调用 DaoSupport的实现类来使用。然而 BasicDao到底是使用的那个实现类,我们通过 spring的 IoC,通过配置文件来决定到底使用哪个实现。同时, BasicDao也不要使用诸如 SpringContext的类来实现 IoC,而是通过建立 和 方法,然后在 spring配置文件中建立引用。
2.       编写Action的时候不要直接使用spring和spring的继承类
前面我说了应当避免 DAO引用 spring或 hibernate及其继承类。同样的事情也发生在 Action中。由于 Action通常不纳入 spring的管理,因此 Action在通过 spring调用某个 BUS的时候,往往是去引用一个叫 的类( spring的类 的继承类 然后使用它的 方法。如此的使用,我们的 Action将依赖与 spring。我们同样可以使用一个叫 BasicAction的父类,然后用一个接口来隔离 spring。由于 Action通常不纳入 spring的管理,我们通过一个 的配置文件来决定接口到底调用哪个实现类。这样的结构的另一个好处是,我们还可以将所有 Action都必须使用的诸如写日志、用户校验、异常处理都放在父类 BasicAction中,提高系统的可维护性。
 
3.       当BUS需要获取别的模块的数据的时候,不要直接去使用该模块的DAO
我举一个简单的例子:我需要设计一个软件评审的管理软件,该软件分为评审组织者制订评 审计划、评审者分别填写评审表后由评审组织者汇总评审表、评审组织者制作评审报告。这是一个非常简单的项目,分成了三个人来完成。但是项目进行快结束的时 候却出现了问题。填写评审表需要获得评审计划中的一些数据,制作评审报告的数据来源于评审表。项目组在开始编程前先开了一次会,大家约定好了各个部分的数 据格式及其规则,然后开始工作。然而数天后项目组把各个模块整合以后发现,系统根本跑不起来,为什么呢?设计评审计划的人发现,所有评审计划应当按照产品 编号来进行管理而不是项目编号。由于这个变更,填写评审表模块在待评审列表中什么都无法显示;同样,设计评审表的人发现,在一个评审计划中评审表与评审者 不是一对多的关系,而是一对一的关系,因而修改了这两个表的关联。因为这样,在制作评审报告时就不能正确得到评审表数据。其实一个软件项目在整个进行过程 中总是不断变更。我们需要做的不是去抑制这些变更,而应当是通过软件的结构去适应这些变更,即是降低各模块间的依赖(耦合),提高内聚。
拿这个实例来说,当评审表需要调用评审计划的数据的时候,不应当是自己写一个 DAO去调用评审计划的数据,而应当是调用评审计划的接口,将这个任务交给评审计划类来完成。当评审报告需要调用评审表的数据的时候,同样应当去调用评审表的接口,由评审表来实现。同时,这种调用应当是去调用 BUS层的接口。为什么呢?比如在评审计划中的一个业务逻辑是只有在评审计划发布以后才能制作评审表,那么怎样才是已发布的评审计划呢?这个业务逻辑应当由谁来定义?当然是评审计划。在什么地方定义?当然是 BUS而不是 DAO,因为 DAO仅仅是实现数据的持久化,而 BUS才是实现业务逻辑的地方。既然如此,如果评审表去调用评审计划的 DAO, 那么已发布评审计划的业务逻辑必然包含在了评审表的业务逻辑里了。我们假设有一天,已发布评审计划的业务逻辑发生变更了(实际上这样的会在你毫不经意间就 发生了),编写评审计划的人会很快就修改了评审计划的业务实现并且测试通过了。他不知道评审表里也包含了这样的业务逻辑,因而修改后的程序在运行到评审表 的时候就很可能会出错。不幸的是,在实际工作中,同样一个业务逻辑可能包含在无数个你可能知道,但你也可能不知道的代码中。这样的结构就是一个不易于维护 的差的结构。
 
总结:从技术升级和需求变更两方面适应变化



基于Hibernate+Spring+Struts架构的学生选课系统实战项目 Spring支持两种主要的Bean配置方式:XML配置和基于注解的配置。随着现代开发趋势演进,注解方式已成为主流,但仍有必要理解XML的底层机制。Struts2中的Action通常继承自类,该类实现了Action接口并提供了国际化、验证、日志等基础功能。标准Action应遵循以下规范:命名规范:以业务功能命名,如方法签名:公共无参方法,返回String类型结果码结果码约定:推荐使用标准值"success""input""error""login" 阅读详情

相关推荐

JavaEE三大框架整合实战项目——Spring+Struts2+Hibernate实验详解

JavaEE作为企业级应用开发的核心技术体系,构建于多层架构之上,涵盖Web层、业务逻辑层与数据持久层的完整生态。其通过标准化组件模型(如EJB、Servlet、JSP)和容器管理机制,支撑高并发、分布式部署与事务一致性需求。现代JavaEE开发已演进为以Spring为核心的轻量级框架整合模式,结合Struts2实现MVC分离,利用Hibernate简化ORM操作,形成SSH经典架构。借助Maven进行依赖管理与项目构建,配合IDEA等智能开发工具,显著提升开发效率与系统可维护性。

weixin_35433448的博客 540

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

转载自:http://www.boogu.com/caiContent_14324.html问题的提出我常常在思考一个问题,我们如何能设计出高水平、高质量的软件出来。怎样是高水平、高质量的软件?它应当是易于维护、易于适应变更、可重 用性好的一个系统。如何做到这一点呢?答案当然是“低耦合、高内聚”了。低耦合就是软件在构造的时候,各个模块、各个功能、各个类都不会过度依赖于它周围 的环境。只有这样,

剑晖(广州)的专栏 638

利用CiteSpace实现知网专利文献的高效计量与可视化分析

本文详细介绍了如何利用CiteSpace软件对中国知网(CNKI)的专利文献进行高效的文献计量与可视化分析。文章提供了从数据获取、格式转换、参数设置到图谱解读的完整工作流,旨在帮助研究者快速掌握该工具,从而洞察技术领域的研究热点、核心机构、学者合作网络及发展趋势,提升专利情报分析效率。

weixin_28520495的博客 293

高内聚低耦合的软件设计

问题提出 我常在想一个问题,我们如何才能设计出高质量、高水平的软件来?那么,什么才是高质量、高水平的软件呢?它应当是易于维护、易于适应变更、可重用性好的一个系统。如何才能做到这一点,答案是“高内聚低耦合”。 低耦合就是软件在构造的时候,各个模块、各个功能、各个类都不会过度依赖于它周围的环境。只有这样,才能使我们的模块(功能、类)在周围发生变更时不受影响,做到易于维护和易于适应变更。正因为如此,也

jiazheng.li的优快云博客 1547

Qt Tab Widget 实战:如何打造一个可动态增删的标签页管理器(附完整代码)

本文深入探讨了使用Qt框架中的Tab Widget控件构建动态标签页管理器的实战方法。通过分析动态增删的核心挑战,提供了完整的C++代码示例,涵盖信号槽机制、页面生命周期管理、上下文菜单实现以及状态持久化等关键功能,帮助开发者打造高效、用户友好的桌面应用界面。

bb456的博客 1045

【硬件开源实战】STM32G070RBT6开发板从设计到避坑全解析

本文全面解析了STM32G070RBT6开发板从硬件设计到避坑的实战经验。详细介绍了电源设计、时钟电路、PCB布局等关键环节,分享了成本控制、焊接测试、软件开发和外设驱动的实用技巧,帮助开发者高效完成项目开发。

weixin_26897585的博客 239

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

如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件 文章摘自优快云 问题的提出我常常在思考一个问题,我们如何能设计出高水平

为天加朵云... 1399

node-red 可视化探索

配置socket选择配置流程产生url。

weixin_44133581的博客 3414

高内聚低耦合

原起: 每每看一些Spring、MVC的资料都会看到一些低耦合啊之类的好处,学习时也经常听到关于高内聚、低耦合,但总感觉太模糊,自己也说不出个所以然来,故查阅资料,总结了一些自己能够理解的东西做个简短记录,方便日后查阅、修改、提升。 定义: 耦合是程序模块之间的联系,是对某元素与其它元素之间的连接、感知和依赖的度量 内聚是程序模块内部的联系,是对软件系统中元素职责相关性和集中度的度量 这里就需要首先明确一下元素指的是什么,我理解这里的模块即可以是功能(方法)、对象(类),也可以指系统、子系统、模块等。后面整

Czc_gg的博客 565

多模态论文笔记——VQ-VAE和VQ-VAE-2

本文详细介绍VQ-VAE和VQ-VAE-2的原理和训练过程,为后面的dVAE在DALLE中的使用打下坚实的基础。

haopinglianlian的博客 3302

微信小程序 - 详细实现可移动悬浮按钮,全屏悬浮元素图标可拖动拖拽并自动吸附边缘,微信小程序实现悬浮球吸附边缘+计算靠边靠拢效果(详细代码,拖拽中途放手,靠左就自动跑到屏幕左侧,反之靠右跑到屏幕右侧)

微信小程序,vue2,vue3,微信小程序悬浮功能小按钮,自动吸附边缘效果,微信小程序之可拖动悬浮按钮的实现,如何实现靠近边缘自动吸住功能,小程序右下角的悬浮效果,实现可拖动悬浮图标,自动向两边靠拢,悬浮按钮的实现,微信小程序悬浮球效果,微信小程序(可拖动悬浮按钮)当靠近屏幕边缘时会磁吸靠近,如何实现全局悬浮按钮,悬浮球判断吸附在左右,全屏悬浮能拖着走,小程序怎么做悬浮图标靠近左右两侧能吸附住,悬浮菜单按钮,悬浮球可拖拽,全局悬浮球,全局悬浮框,实现悬浮按钮可拖动,自动吸附边缘效果,若按钮此时位于页面中间偏

🏆 前端领域优质创作者 1万+

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

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

充满诗意的联盟 225

C#面试题及详细答案120道(61-75)-- 多线程与异步

本文摘要了前后端面试题中关于线程与并发的核心知识点,包括线程与进程的区别(61题)、Thread/ThreadPool/Task的对比(62题)、线程安全实现方法(63题)、lock关键字的原理(64题)、Monitor类的进阶用法(65题)以及死锁的成因与避免(66题)。通过C#代码示例和表格对比,清晰展示了多线程编程的关键概念、应用场景及常见问题解决方案,适合开发者快速掌握面试高频考点。完整内容可访问专栏目录获取更多技术面试题解析。

大剑师兰特的GIS世界 1432

Java框架与低耦合(转)

转自:http://www.cnblogs.com/tiwlin/archive/2010/02/24/1672459.html s1. 低耦合(Low Coupling) “低耦合”这个词相信大家已经耳熟能详,我们在看spring的书籍、MVC的数据、设计模 式的书籍,无处不提到“低耦合、高内聚”,它已经成为软件设计质量的标准之一。那么什么是低耦合?耦合就是对某元素与其它元素之间的连接、感知...

weixin_30735391的博客 289

开源大语言模型GLM-5:从架构解析到部署微调全指南

大语言模型(LLM)作为当前人工智能领域的核心技术,通过海量数据预训练获得强大的语言理解和生成能力。其核心原理基于Transformer架构,通过自注意力机制捕捉长距离依赖关系,在通用语言任务上展现出卓越性能。这一技术价值在于为开发者提供了强大的基座模型,能够通过微调快速适配特定领域需求,显著降低AI应用开发门槛。在实际应用场景中,大模型被广泛用于智能对话、代码生成、内容创作等任务。本文以开源项目GLM-5为例,深入探讨其架构特点,并详细介绍了如何使用LoRA技术进行参数高效微调,以及通过量化优化实现模型在

weixin_28683165的博客 351

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

如何构建灵活可靠复用性高的软件-<struts+spring+hibernate的框架下构建低耦合高内聚的软件>读后有感...

如何构建灵活可靠复用性高的软件的思路和实现        原文作者提出了以下几个问题,并作出了相应的回答。 1、    我们如何能设计出高 水平、高质量的软件出来。怎样是高水平、高质量的软件?它应当是易于维护、易于适应变更、可重用性好的一个系统。如何做到这一点呢?  答案:低耦合、 高内聚。低耦合就是软件在构造的时候,各个模块、各个功能、各个类都不会过度依赖于它周围的环境。只有这样,才能使我们...

hoonecan的专栏 239

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

低耦合,简单易懂

低耦合 1.    低耦合(Low Coupling) “低耦合”这个词相信大家已经耳熟能详,我们在看spring的书籍、MVC的数据、设计模 式的书籍,无处不提到“低耦合、高内聚”,它已经成为软件设计质量的标准之一。那么什么是低耦合?耦合就是对某元素与其它元素之间的连接、感知和依赖的量 度。这里所说的元素,即可以是功能、对象(类),也可以指系统、子系统、模块。假如一个元素A去连接元素

qq_32528231的博客 4387

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

关于Struts2.1+Spring3.0+Hibernate3.3整合

(转载) 关于Struts+Spring+Hibernate整合的问题 我们如何能设计出高水平、高质量的软件出来。怎样是高水平、高质量的软件?它应当是易于维护、易于适应变更、可重用性好的一个系统。如何做到这一点呢?答案当然是“低耦合、高内聚”了。低耦合就是软件在构造的时候,各个模块、各个功能、各个类都不会过度依赖于它周围的环境。只有这样,才能使我们的模块(功能、类)在周围发生变更时不...

aoquan8892的博客 139
上一篇: 利用Session防止表单重复提交
下一篇: 高负载系统架构设计(转)
jayluns
博客等级 码龄17年 9粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值