转自http://fei-6666.iteye.com/blog/446247,记录下来

一,Service->DAO,只能在Service中注入DAO。

二,DAO只能操作但表数据,跨表操作放在Service中,Service尽量复用DAO,只有一张表产生的业务放入DAO中。

三,事务操作,放在一个DAO中。

四,如果有更大Service的之间的复杂调用,考虑在service上再加Facade层(Components组件)。

五,多考虑这部分代码放在哪里,多里利用上下分层,增加代码可读性,提高代码复用率。

服务层处理业务逻辑,DAO封装Entity对象,Action作为Controller处理分发。 
业务逻辑是最容易变化的地方,当业务改变时,只增加修改相应的代码即可。真正享受分层带来的益处。

文章出处:http://www.diybl.com/course/3_program/java/javaxl/2008620/126932.html 
  
 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机。

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

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

转载于:https://www.cnblogs.com/xtf2009/p/9494649.html

facade层,service 层,domain层,dao 层设计相关推荐

  1. Spring、Mybatis整合Service优化思路,DAO层、Service层最终编码以及log4j日志的使用

    5. Spring.Mybatis整合Service层事务控制优化思路分析 # spring中处理事务的两种方式1. 编程式事务处理定义:通过在业务层中注入事务管理器对象,然后通过编码的方式进行事务控 ...

  2. websocket连接mysql_websocket 使用 spring 的service层 ,进而调用里面的 dao层 来操作数据库 ,包括redis、mysql等通用...

    1.前言 描述一下今天用websocket踩得坑  --->空指针异常! 我想在websocket里面使用service 层的接口,从中获取数据库的一些信息  , 使用 @Autowired 注 ...

  3. SSM框架中各层的含义和联系(Pojos层、Dao层、Service层、Action层......)

    一.pojo层 即Plain Ordinary Java Object,也有人称其为model.domain.bean等,pojo层是对应的数据库表的实体类. 二.1.持久层:Dao层(Mapper) ...

  4. [转]JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分

    首先这是现在最基本的分层方式,结合了SSH架构.modle层就是对应的数据库表的实体类.Dao层是使用了Hibernate连接数据库.操作数据库(增删改查).Service层:引用对应的Dao数据库操 ...

  5. Entity层、DAO层、Service层、Controller层 先后顺序

    写法顺序: 1.数据库表 2.实体层 3.DAO层写接口 4.Mapper层写和DAO层对应的映射规则,即SQL和POJO的映射规则.其中<select>元素定义的resultType指向 ...

  6. JAVA中Action层, Service层 ,model层 和 Dao层的功能区分

    首先这是现在最基本的分层方式,结合了SSH架构.model层就是对应的数据库表的实体类.Dao层是使用了Hibernate连接数据库.操作数据库(增删改查).Service层:引用对应的Dao数据库操 ...

  7. Spring Boot开发基于三层架构设计:Dao层、Service层、Controller层

    三层架构设计:基于Spring Boot开发要使用三层架构: 数据访问层(Dao).业务逻辑层(Service).控制层(Control-ler) (1)数据访问层(Dao):Dao层是最底层的设计, ...

  8. java sdi接口是什么意思_JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分

    首先这是现在最基本的分层方式,结合了SSH架构.modle层就是对应的数据库表的实体类.Dao层是使用了Hibernate连接数据库.操作数据库(增删改查).Service层:引用对应的Dao数据库操 ...

  9. Action层, Service层 ,modle层 和 Dao层的功能区分【和语言无关,只是为了了解这几个层是干什么的】

    来源:http://www.xuebuyuan.com/2153333.html  Action主要的功能就是组织service的,比如你要做权限验证,那么请求会被Action获取,那么如何验证呢?A ...

  10. Spring boot 三层框架dao层、service层、controller层+实体model层

    Spring boot 三层框架dao层.service层.controller层+实体model层 model层 dao层 service层 controller层 首先创建一个springboot ...

最新文章

  1. 图灵2月书讯:书籍,不可分离的生命伴侣
  2. 慕了!北京大学新校区来了!
  3. asp.net MVC 的处理流程
  4. 民营企业的ERP之路
  5. mysql 连接校对_教你轻松的掌握 MYSQL连接字符集和校对
  6. QT的Q3DTheme类的使用
  7. bzoj3195 [Jxoi2012]奇怪的道路
  8. PHP EOF(heredoc)的使用方法
  9. php model controller,Laravel 中 Controller访问Model函数/常量
  10. 【Retinex】【Frankle-McCann Retinex】matlab代码注释
  11. 云熙文机器人_【侵木抖音热文】萌宝101:总裁爹地快追妻(韩宇廷 秦云熙)
  12. mongodb数据库
  13. 学说话:和光合作用五道口店咖啡吧的小姑娘过招儿;推荐:《如何听如何说》 - [学说话]
  14. DeepMind AlphaStar星际争霸2首秀:Demo很强大,但现场比赛输了
  15. 中国的超级计算机银河号,美国突然切断GPS,是银河号的一次屈辱,中国:不会再让悲剧发生...
  16. python生成exe运行慢_利用pyinstaller生成exe文件碰到的一些问题及解决方法
  17. 20140309_博瑞学习
  18. Python GDAL矢量转栅格详解
  19. js实现数字时钟,按钮实现暂停开始
  20. 构建MFS+Keepalived双机高可用热备方案`

热门文章

  1. 蜘蛛日志分析工具_如何分析网站日志 - 360蜘蛛池
  2. 如何用python画矿物分布地图_python怎么画出分布图?
  3. 从零开始学android编程_从零开始学机械,如何画好一张零件图?图文详解!-UG编程...
  4. 蓄电池单格电压多少伏_直流屏蓄电池电压的常见问题小结
  5. 【2020牛客寒假基础算法训练营】第六场总结
  6. pat-A1043:Is it a Binary Search Tree(二叉搜索树和及其镜像树的遍历)
  7. python火车票查询系统_Python脚本实现12306火车票查询系统
  8. 8g内存一般占用多少_手机6G和8G运存有什么不同,8G运存真比6G流畅?这也要考虑处理器...
  9. node 多进程 vs java_如何理解node的多进程
  10. C/C++[codeup 1941]新版A+B