文档章节

如果DAO,Service,Controller返回的数据实体结构一致,我们该怎么办?

wanxiangming
 wanxiangming
发布于 07/02 14:01
字数 1389
阅读 53
收藏 1

如果DAO返回的实体结构,刚好也符合Service想要返回的实体结构,刚好也符合Controller想要返回的实体结构。我们该怎么办?

仅个人观点

按照较为规范的开发流程,我们会通过需求分析出Controller返回实体的结构,根据“下层为上层服务,以目标为导向”的原则,设计出Service层返回的实体结构,同理设计出DAO层返回的实体结构。三个实体结构一致,说明我们只是简单的返回数据库数据。

DAO层和Service层的分离是比较彻底的,DAO和Service没有一一对应的关系,DAO具有复用性。DAO层的实体一定是申明在DAO相关包下的(比如com.demo.dao.entity包下)。Service能否直接使用DAO的实体作为返回呢?

如果使用,则Service的接口抽象和DAO的接口抽象发生了绑定,这意味着,如果DAO的返回实体结构发生了变化,则Service的接口抽象也会跟着发生变化。而DAO和Service是分离的,所以DAO的开发人员不知道也不对Service的这次变化负责。当DAO的抽象发生变化时,Service的开发人员需要判断新的返回实体是否依然符合Service这个接口的抽象(也就是说,是否是业务的变化导致了这个变化),如果符合,说明业务发生了变化,此时Service接收这个变化,并将变化辐射到了Controller;如果不符合,说明DAO修改后的返回实体已经不符合当前Service接口的要求,此时Service需要申明自己的返回实体,修改此接口的抽象,Controller依然会被变化辐射。

如果Service返回实体不使用DAO返回实体,当DAO返回实体发生变化时,Service开发人员需要关注这次变化,这是他作为依赖方的必要工作,此时他需要根据业务逻辑判断,Service的返回是否应该发生变化:如果需要则修改Service返回实体,这就改动了Service的接口抽象,这个变化就会辐射到Controller;如果不需要则Service将会自己消化这个DAO的变化,则这个变化不会辐射到Controller

Controller和Service的情况同理,结论就是,如果Controller和Service的返回实体发生了绑定,则Service的抽象发生变化一定导致Controller的抽象发生变化,如果不绑定,则Controoler的抽象有可能受影响,有可能不受影响。

但是,有一点和Service不一样,Controller的返回值依托的是HTTP协议(大多数情况下来说是这样。但有时不是,比如Spring Cloud微服务体系,通过Feign API项目嫁接在一起的两个项目,虽然在网络上通过HTTP协议交互,但其实质还是Java语言层的数据交换),而不是像Service的返回一样依托编程语言的类型检查。这意味着,Controller的接口抽象比Service的接口抽象有更宽松的自解释权,Controller更关心你返回的具体数据是什么,而不是你返回的数据的类型。换句话说,就算变化辐射到了Controller,Controller也拥有较大的自由度,在不改变接口(这个接口指的是Http api)的前提下适应变化。

所以我认为,在题目所述的情况下,可以使用绑定,绑定可以减少系统传递数据时的内存消耗;避免了开发时写一堆呆萌的设值代码。而面对需求变化时,我们可以通过增加新接口的方式实现,并不需要通过修改现有接口,如果是数据库变化这样的剧烈改动,那系统也只能是忍着疼痛了,因为就算不绑定,DAO层发生的接口抽象的变化,一定会辐射到Service层,Service层倒是有能力吃下这个变化,但往往并不能如愿,何况从系统结构的角度来说,Service和Controller是靠的很近的,Controller响应Service的变化,一般不是很吃力的事情。

在使用绑定的情况下,要注意,不是你自己的返回实体,不要动(注解,注释,代码都不能动,因为它不是你的东西)。比如Controller不能因为自己的业务需要改动Service的返回实体结构,Service不能改动DAO的返回实体结构。除了你要明确你所使用的实体你是否可以改动外,你还要根据整个项目的公约来,假如架构师要求每个层次的返回实体必须明确区分,那你也只能忘记这篇博客所说的东西,老实的创建自己的实体。最后,博客用从DAO到Controller都一样的情况做为例子描述观点,但分开来判断任何相邻两层的绑定,都是适用的。

© 著作权归作者所有

wanxiangming
粉丝 3
博文 24
码字总数 38833
作品 0
东城
私信 提问
Spring Boot总结(6)---数据连接Web实战

上篇讲述了Spring Boot数据访问相关知识,这篇结合项目实战Spring Boot的数据连接,体会其强大与快捷性。 我们采用之前的简单项目demo,不了解的可跳转前往查看,跟随文章可 10分钟快速搭建 ...

weberweber
2017/09/08
0
0
SSM(Spring+Spring MVC+Mybatis)框架搭建(已附上demo)

一. SSM框架架构及流程介绍 SSM框架,通常是指将spring mvc+spring+mybatis三个框架整合在一起进行工作,spring mvc本身就是spring的一部分,所以这两者之间不用整合,这里主要做的事情就是将...

潜行-L
07/19
92
0
【maven + hibernate(注解) +spring +springMVC】 使用maven搭建项目

研究,百度,查资料+好友帮助,使用MyEcplise2015工具,通过maven搭建hibernate+springMVC+spring的项目,数据库采用MySql5.5 不过使用的版本会在项目搭建过程中介绍。 大概就是下面的几个步...

angel挤一挤
2016/06/22
0
0
My First Spring-boot Project Notes

注:这里仅仅是一些我所注意的东西或者遇到的问题。 1、model划分,domain + mapper + po 三层 (1)、po 层是真正的实体类层,与数据库中标字段一一对应,extends AbstractPo。AbstractPo ...

Timor_张先生
2017/11/13
0
0
关于SSM框架中Dao层,Mapper层,controller层,service层,model层,entity层

SSM是sping+springMVC+mybatis集成的框架。 MVC即model view controller。 model层=entity层。存放我们的实体类,与数据库中的属性值基本保持一致。 service层。存放业务逻辑处理,也是一些关...

Aeroever
04/01
72
0

没有更多内容

加载失败,请刷新页面

加载更多

Giraph源码分析(八)—— 统计每个SuperStep中参与计算的顶点数目

作者|白松 目的:科研中,需要分析在每次迭代过程中参与计算的顶点数目,来进一步优化系统。比如,在SSSP的compute()方法最后一行,都会把当前顶点voteToHalt,即变为InActive状态。所以每次...

数澜科技
58分钟前
2
0
Xss过滤器(Java)

问题 最近旧的系统,遇到Xss安全问题。这个系统采用用的是spring mvc的maven工程。 解决 maven依赖配置 <properties><easapi.version>2.2.0.0</easapi.version></properties><dependenci......

亚林瓜子
今天
7
0
Navicat 快捷键

操作 结果 ctrl+q 打开查询窗口 ctrl+/ 注释sql语句 ctrl+shift +/ 解除注释 ctrl+r 运行查询窗口的sql语句 ctrl+shift+r 只运行选中的sql语句 F6 打开一个mysql命令行窗口 ctrl+l 删除一行 ...

低至一折起
今天
7
0
Set 和 Map

Set 1:基本概念 类数组对象, 内部元素唯一 let set = new Set([1, 2, 3, 2, 1]); console.log(set); // Set(3){ 1, 2, 3 } [...set]; // [1, 2, 3] 接收数组或迭代器对象 ...

凌兮洛
今天
2
0
PyTorch入门笔记一

张量 引入pytorch,生成一个随机的5x3张量 >>> from __future__ import print_function>>> import torch>>> x = torch.rand(5, 3)>>> print(x)tensor([[0.5555, 0.7301, 0.5655],......

仪山湖
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部