对J2EE应用系统分层设计的思考

J2EE分层设计是Java企业应用的最基本的设计思想。

从最常规的分层结构来说,系统层次从上到下依次为:

表现层:主要是客户端的展示。

服务层:直接为客户端提供的服务或功能。也是系统所能对外提供的功能。

领域层:系统内的领域活动。

DAO层:数据访问对象,通过领域实体对象来操作数据库。

其中有些指导原则:

1、上层总是依赖其下层,依赖关系不跨层。

2、表现成除外,同一层之间方法不允许相互调用。这是实际开发中一些开发者容易范的错误!如果真是同一层之间存在方法调用,需要注意,这些调用都是一些上层不可见方法,比如一些工具方法等。

3、一切从服务层出发,从系统需要提供的功能进行分析,确定Service接口中的方法。而不是从数据库的表出发,创建DAO,再创Domain,然后Service,这实际上是对系统分层的误解。

4、系统最核心的设计就是将系统中的实体划分为领域模型。在此基础上设计数据的DAO层,并将这些活动暴露给服务层,服务层的实现依赖于领域活动。

5、每个接口的职责范围明确有界。

在我所做的系统中,常常看到一些糟糕的编码:系统设计从表开始,一个表对应一个DAO,一个DAO对应一个domain,一个Domain对应一个Service,实际上Service的接口和DAO的接口基本上完全一样!导致Service的接口方法超多!到了表现层,前台程序员在写Action的时候,Action中反复的调用Service方法,代码不堪入目。

正确的设计应该是,一个领域活动会聚合对应一个或一组DAO,来完成一个领域活动。而一个服务可能包含两个领域活动,比如一个转账的业务,对应两个领域活动。两个帐户的金额分别发生变化,需要操作一组领域活动,而每个活动需要操作很多表(调用多个DAO)。 事务的控制我们可以放到Service层。

目前,越来越多的架构师喜欢领域模型驱动设计,针对系统的领域模型建模,然后上层直接是Service,Service下面就是领域活动层Activity,从而去掉了DAO层,这样做的优点是系统设计思路更清晰,目标更明确。可以避免上面所说的一个表对应一个DAO、Service的情况。

但缺点是当领域活动发生变化的时候,会引起领域活动层代码的变化。并且,当要更换持久化框架或者技术时候,领域活动要重新实现。

但综合考虑起来,这样带来的优点也很多,而实际上更换数据库和持久化框架的情况很少,因此这样的设计也是有其合理性一面的。这样做实际上是将原来的DAO和Domain层合并为一个Activity.但上层的设计思路还是一致的。

其实Service层的设计也很讲究,其中就是要控制Service的数量,从Service层往下,接口数量逐层增加。通常将一个模块的服务都集中到一个Service中来处理。

每层中的每个接口都应该关注的是自己的那一块,而不是吃着碗里看着锅里,牛槽伸出个狗舌头,最典型的例子就是一个DAO中胡乱操作别的表。这种凌乱的实现只会置项目经理与死地。也会为软件的维护带来很大代价。

笔者曾遇到这样的团队,缺乏对整个项目的整体设计,一个表一个DAO,对应一个Service,系统也不大,三四十张表,但是性能相当地下,经常down机。

最终发现,失败不是开源框架和数据库以及应用服务器和硬件配置的错,根源在于拙劣的设计导致。

希望以后大家在做项目的时候能注意点

时间: 2024-08-03 19:50:47

对J2EE应用系统分层设计的思考的相关文章

《解剖PetShop》之一:PetShop的系统架构设计_自学过程

前言:PetShop是一个范例,微软用它来展示.Net企业系统开发的能力.业界有许多.Net与J2EE之争,许多数据是从微软的PetShop和Sun的PetStore而来.这种争论不可避免带有浓厚的商业色彩,对于我们开发人员而言,没有必要过多关注.然而PetShop随着版本的不断更新,至现在基于.Net 2.0的PetShop4.0为止,整个设计逐渐变得成熟而优雅,却又很多可以借鉴之处.PetShop是一个小型的项目,系统架构与代码都比较简单,却也凸现了许多颇有价值的设计与开发理念.本系列试图对

基于分层设计的插装阀集成块CAD方法

0 引言 随着二通插装阀控制技术日益广泛的应用,插装阀液压集成块 的设计问题已愈加受到人们的关注.由于插装阀元件的结构特殊性和集成块内部 孔道连通的复杂性,使集成块设计工作具有相当难度,颇费工时且容易出错.因 此,在设计过程中采用CAD技术和方法已成为行业内的必然选择.但在目前,国 内外所见的液压集成块CAD研究基本上集中在原理图绘制.孔道校核及二维工程 图输出等方面,很少涉及到液压集成块中元件布局和孔道连通的自动优化设计, 且大多数研究都集中在板式阀,针对插装阀的则较少见. 同时,随着CAD

基于WPF系统框架设计(5) Ribbon整合Avalondock 2.0实现多文档界面设计(二)

AvalonDock 是一个.NET库,用于在停靠模式布局(docking)中排列一系列WPF/WinForm控件.最新发布的 版本原生支持MVVM框架.Aero Snap特效并具有更好的性能. AvalonDock 2.0版本已经发布了,新版本 是用MVVM框架重新编写,似乎也用了Command(命令)模式.2.0版的文档尚未发布,但你可以参考 Avalon.TestApp 或者2.0版源码中的Avalon.MVVMTestApp文件夹来查看新的API. 前一篇博文有介绍关于AvalonDoc

基于Web在线考试系统的设计与实现

这是一个课程设计的文档,源码及文档数据库我都修改过了,貌似这里复制过来的时候图片不能贴出,下载地址:http://download.csdn.net/detail/sdksdk0/9361973   数据库原理课程设计说明书              基于Web在线考试系统的设计与实现             目  录   1 课题背景与意义.3 1.1课题开发背景.3 1.2 课题开发意义.3 2 系统需求分析.4 2.1 项目要求.4 2.2 开发方案.5 2.3开发环境.5 3 总体开发.

基于Kubernetes的PaaS平台设计和思考

本文讲的是基于Kubernetes的PaaS平台设计和思考[编者的话]文章介绍了PaaS平台的意义,为什么选择Kubernetes,PaaS平台上的微服务架构应用,如何设计和快速构建PaaS平台,PaaS平台的功能组件这几个内容. [烧脑式Kubernetes实战训练营]本次培训理论结合实践,主要包括:Kubernetes架构和资源调度原理.Kubernetes DNS与服务发现.基于Kubernetes和Jenkins的持续部署方案 .Kubernetes网络部署实践.监控.日志.Kubern

spring-j2ee系统架构设计 请求帮忙

问题描述 j2ee系统架构设计 请求帮忙 现在系统有这样的需求, 所有的controller调用一个service入口(controller 与service分开的两个工程), 在这个入口的service根据不同的参数分发到不同的service处理, 就想请问各位大神有不有好的解决方案(目前就考虑到用反射) 解决方案 再进一步,你可以用标注将参数标在你的service实现类上,反射的时候遍历所有实现了这个接口的类,然后找参数和标注符合的. 好处就是你添加新的参数,直接写好实现类丢进去就可以了.不

分层设计与分层测试

分层是复杂软件系统常见的设计思路.比如互联网的七层/五层模型,Android系统的APP/FWK/JNI/Kernel等,都是通过分层.解耦,达到简化问题,易于维护,便于扩展的效果. 传统的黑盒测试主要关注客户需求,白盒测试比较灵活,但实际应用中以验证编码实现为主,两者都忽略了设计这个开发过程中承上启下的环节.分层测试的核心思想是:针对有明确分层设计的软件系统,采用白盒测试的技术,在层与层之间验证接口的正确性.分层测试以调用接口驱动被测系统,尽量不依赖于打桩(具体原因后面会提到).去年下半年开始

SaaS 系统架构设计经验总结

2B SaaS系统最近几年都很火.很多创业公司都在尝试创建企业级别的应用 cRM, HR,销售, Desk SaaS系统.很多SaaS创业公司也拿了大额风投.毕竟SaaS相对传统软件的优势非常明显. 最近一年,有幸架构一个Crm SaaS 系统,上线了几个月来,各方面都比满意.整个系统创建过程,踩了很多坑,收获也比较多.总结一下SaaS系统架构一些特点: 1.分层设计 SaaS系统分层大概是: 租户识别>应用层>数据访问层>缓存层>数据库 业务代码都是写在应用层. 租户识别可以用s

《逻辑与计算机设计基础(原书第5版)》——3.1 开始分层设计

3.1 开始分层设计 如第1章所述,设计一个数字系统的过程为:1)指定所需的行为.2)以布尔方程或真值表的方式对系统的输入与输出关系进行形式化.3)优化逻辑行为的表示,减少所需逻辑门的数量,就如第2章中介绍卡诺图时那样.4)将优化后的逻辑映射到可以实现的工艺上,比如第2章中的逻辑门或本章所述的功能模块.5)验证最后设计的正确性,以便满足功能描述.本章将重点介绍组合逻辑设计过程的前4步,从指定系统到映射逻辑至可以实现的工艺.但在实际的设计实践中,最后一步验证设计正确性通常在设计工作精力中占相当大的