对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机。

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

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

原文出处:http://lavasoft.blog.bitscn.com/62575/83974

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

时间: 2024-10-11 16:15:52

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

基于J2EE新闻发布系统的设计与实现——论文随笔(十四)

一.基本信息 标题:基于J2EE新闻发布系统的设计与实现 时间:2010-10 出版源:南昌大学 领域分类:系统架构和设计 二.研究背景 问题定义:很多企业都没重视前期的市场调查 , 导致许多低质量或者说是不符合要求的新闻发布系统出现 , 因此在建新闻发布系统前进行市场分析就显得更重要了 , 只有了解好企业所在的市场才能结合自身现状建设出高水准的新闻发布系统来 . 相关工作:本文提出开发一个新闻发布系统的想法 ,基于J2EE设计方法设计. 三.创新方法 1.all in one 的J2EE的设计

产品那点事【5】- 优惠券/红包系统通用设计思考

优惠券/红包—系统通用设计思考 目录: 1.作用 2.类型 3.后台全链路设计 一.作用 —> 红包作用: 1.拉新 2.促活 3.社交关系 二.类型 —> 红包分类: 1.push红包 这类红包是指直接发到用户账户并使用短信或push文案通知的形式,这是最常规的红包形式,用户被动接受优惠信息未形成深刻印象. 2.渠道红包 渠道红包,顾名思义,是用户产品早中期渠道拉新使用.与同行业的联合营销和其他行业的跨界营销,通过渠道红包发券落地页的形式拉新. 3.分享红包 分享红包是指带有分享属性的红包,

petshop4.0 具体解释之中的一个(系统架构设计)

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

Unity3D手游开发日记(2) - 技能系统架构设计

我想把技能做的比较牛逼,所以项目一开始我就在思考,是否需要一个灵活自由的技能系统架构设计,传统的技能设计,做法都是填excel表,技能需要什么,都填表里,很死板,比如有的技能只需要1个特效,有的要10个,那么表格也得预留10个特效的字段.在代码里面也是写死一些东西,要增加和修改,就得改核心代码,如果我要把核心部分做成库封装起来,就很麻烦了. 能不能做成数据驱动的方式呢? 改技能文件就行了,即使要增加功能,也只需要扩展外部代码,而不用改核心代码, 我是这么来抽象一个技能的,技能由一堆触发器组成,比

应用层的容错与分层设计

针对在项目中碰到的一些容错设计问题,团队最近进行了一次技术沙龙,讨论了以下话题. 为什么需要应用层的容错设计? 一个完整的系统在内部是由很多小服务构成,服务之间以及服务与资源之间会存在远程调用. 每个系统的可用性不可能达到100% 各种网络及硬件问题,如网络拥堵.网络中断.硬件故障…… 远程服务平均响应速度变慢 服务器平均响应速度如果慢下来,慢慢消耗掉系统所有资源,进而导致整个系统不可用.因此在分布式系统中,除了远程服务本身需要有容错设计之外,在应用层的远程调用的环节,需要有良好的容错设计. 应

系统构架设计应考虑的因素

系统构架设计应考虑的因素 摘要:本文从程序的运行时结构和源代码的组织结构两个方面探讨了系统构架设计应考虑的各种因素,列举了系统构架设计文档应考虑的一些问题. 关键字:系统构架.设计.考虑.因素 正文:约公元前25年,古罗马建筑师维特鲁威说:“理想的建筑师应该既是文学家又是数字家,他还应通晓历史,热衷于哲学研究,精通音乐,懂得医药知识,具有法学造诣,深谙天文学及天文计算.”(好难哪,软件构架设计师的要求呢?大家好好想想吧.) 本文目录一.与构架有关的几个基本概念: 二.构架设计应考虑的因素概揽:

斯坦福第十一课:机器学习系统的设计(Machine Learning System Design)

11.1  首先要做什么 11.2  误差分析 11.3  类偏斜的误差度量 11.4  查全率和查准率之间的权衡 11.5  机器学习的数据 11.1  首先要做什么 在接下来的视频中,我将谈到机器学习系统的设计.这些视频将谈及在设计复杂的机器 学习系统时,你将遇到的主要问题.同时我们会试着给出一些关于如何巧妙构建一个复杂的机器学习系统的建议.下面的课程的的数学性可能不是那么强,但是我认为我们将要讲到的 这些东西是非常有用的,可能在构建大型的机器学习系统时,节省大量的时间. 本周以一个垃圾邮件

佩特来项目经验小集合(5)___系统流程设计

在佩特来项目设计中有一个流程设计问题,虽然.NET 和Java都有工作流,但是考虑到这个项目小,这里就简单的借用一点工作流的思想,设计了几张表,然后通过代码来控制流程.下面以"维修鉴定单业务流程"中的有实物流程为例,谈一下具体的流程设计.有实物的维修鉴定业务流程包含大致步骤:代理商填单.打印二维码.拆包.沟通转办.拆分.故障分析.各角色对费用进行审批.费用提交到费用池(统计各代理商金钱的地方).维修鉴定单流程见下图: 因为系统中不止这一个业务流程,所以系统流程设计的表有任务表(如维修鉴

嵌入式软件架构设计之分层设计

在实际的项目开发中,项目往往是并行开发的,也就是说硬件设计,底层软件设计,应用软件设计是同步进行的.比如说在开发板上调试模块驱动,在其他平台上调试应用再移植到目前这个平台等.这里又涉及到如何提高嵌入式应用软件的可移植性的问题,这个问题在下一篇博文中专门讲解,敬请期待.要想开发的应用程序在不同的嵌入式平台上具有高效率的可移植性,像Android sdk一样,统一的接口规范是必须的. 本文所要提到的嵌入式,其实更偏向于单片机.因为经典的linux+arm配置属于资源比较丰富,高配的嵌入式系统,其操作