背景

在日常的工作中,我们经常会发现很多项目的业务处理逻辑都放在controller中,导致service除了调用dao获取数据之外没有任何逻辑,以我们要获取用户信息为例,以下是错误示例

获取用户信息的简单 controller:
@Slf4j
@Controller
public class DemoController {@AutowiredDemoService demoService;@GetMapping("/demo")@ResponseBodypublic User demo(Integer userId) {//检查用户ID是否合法this.checkUserId(userId);User user = this.demoService.getUser(userId);//转换数据库User信息到需要返回的UserVO内UserVO userVO = this.convertToUserVO(user);return userVO;}}
获取用户信息的简单 service:
@Service
public class DemoServiceImpl implements DemoService {@ResourceDemoDao demoDao;@Overridepublic User getUser(Integer userId) {return this.demoDao.getUser(userId);}
}
获取用户信息的简单 dao:
public class DemoDao {public User getUser(Integer userId){User user = super.sqlSessionTemplate.selectOne(userId);//检查用户是否被禁用if(this.checkUserValid(user)){return user;}return null;}
}

相信以上形式的代码存在于各种项目内,由此引发思考

  1. controller的职责究竟是什么?
  2. service的职责又是什么?
  3. dao呢?

controller 控制器

新华字典释义
【控制】:掌握住不使任意活动或越出范围。

说明控制器的作用是不允许用户任意执行业务逻辑,对应到controller,我们应该认为controller的职责为如下几点

  1. 谁可以执行?
  2. 接口入参满足执行业务的必要条件吗?
  3. 这个请求是机器人发起的吗?
  4. 需要满足执行业务的其他条件等
    由以上思考我们可以知道controller并不是真正的业务逻辑,而只能作为service的上游判断请求能否执行真正的业务逻辑。

service 服务

新华字典释义
【服务】:为集体(或别人的)利益或为某种事业而工作。

从计算机的角度来看,服务的作用就是真正提供业务实现的代码逻辑而不包含数据校验等与实际业务无关的逻辑。如:获取用户信息,存取款等。

dao (Data Access Object) 数据访问对象

新华字典释义
【访问】:1.有目的地去探望人并跟他谈话:~先进工作者。我怀着崇敬的心情,~了这座英雄的城市。
2.指进入计算机网络,在网站上浏览信息、查阅资料。

我们可以看出,访问在计算机系统内的含义为Read,也就是说我们在使用DAO查询数据的时候并不能对数据做任何更改,否则就破坏了访问的含义。

最后正确的示例如下:

controller
@Slf4j
@Controller
public class DemoController {@AutowiredDemoService demoService;@GetMapping("/demo")@ResponseBodypublic User demo(Integer userId) {//检查用户ID是否合法this.checkUserId(userId);return this.demoService.getUser(userId);}}
获取用户信息的简单 service:
@Service
public class DemoServiceImpl implements DemoService {@ResourceDemoDao demoDao;@Overridepublic User getUser(Integer userId) {User user = this.demoDao.getUser(userId);//检查用户是否被禁用if(this.checkUserValid(user)){//转换数据库User信息到需要返回的UserVO内UserVO userVO = this.convertToUserVO(user);return userVO;}return null;}
}
获取用户信息的简单 dao:
public class DemoDao {public User getUser(Integer userId){return super.sqlSessionTemplate.selectOne(userId);}
}

从新华字典释义的角度理解springboot中controller、service、dao各自的职责相关推荐

  1. 这篇带你深入理解SpringBoot中的自动装配(好文精读)

    作者: 聂晨 cnblogs.com/niechen/p/9027804.html SpringBoot的自动装配是拆箱即用的基础,也是微服务化的前提.其实它并不那么神秘,我在这之前已经写过最基本的实 ...

  2. 从编译器的角度理解代码中的各种古怪写法

    在编写代码时,总会遇到一些"奇怪"的要求或者约束,仔细想想跟正常逻辑似乎不太对应,这时候就需要换个角度来理解了. 比如,按照声明顺序初始化,对象初始化包括两步操作,先初始化后计算赋 ...

  3. springboot中controller单例模式多线程安全的简单理解

    若每个线程中对静态变量(类变量).实例变量(对象变量)只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全. 1) 常 ...

  4. 从数理角度理解生活中的“二八定律”

    一.什么是"二八定律"? 1897年,意大利经济学者帕累托提出该定律. 他在研究财富和收益取样中,发现大部分财富流向了少数人手里,而且在数学上呈现出一种稳定的微妙关系. 最后,帕累 ...

  5. Q1:spring-boot中Controller路径无法被访问的问题

    在学习spring-boot入门的第一个例子就是spring-boot-web的一个在页面上输出hello-world的例子,在运行这个例子的时候我遇到了下面这个简单的问题,但是第一次解决还是花了我很 ...

  6. springboot中controller层代码优雅写法

    在基于spring框架的项目开发中,必然会遇到controller层,它可以很方便的对外提供数据接口服务,也是非常关键的出口,所以非常有必要进行规范统一,使其既简洁又优雅. controller层的职 ...

  7. springboot中对各个层的理解以及流程

    springboot中对各个层的理解 1.entity层:实体层,数据库在项目中的类.也被称为model层,pojo层. 用于定义与数据库对象的属性,提供get/set方法,带参和无参的构造方法. 一 ...

  8. 中科大刘淇:从自适应学习的角度理解AI+教育

    不到现场,照样看最干货的学术报告! 嗨,大家好.这里是学术报告专栏,读芯术小编不定期挑选并亲自跑会,为大家奉献科技领域最优秀的学术报告,为同学们记录报告干货,并想方设法搞到一手的PPT和现场视频--足 ...

  9. springboot中三种xxxx.setAttribute()并与python中flask作对应比较+容器的通俗理解

    对应关系如下: Java python Spring boot Flask import javax.servlet.http.HttpServletRequest; HttpServletReque ...

  10. 以吃货的角度去理解云计算中On-Premise、IaaS、PaaS和SaaS

    了解云计算的一定都听过四个"高大上"的概念:On-Premise(本地部署),IaaS(基础设施及服务).PaaS(平台即服务)和SaaS(软件即服务),这几个术语并不好理解. 不 ...

最新文章

  1. 还在担心写的一手烂SQL,送你4款工具
  2. 使用postman模拟登录请求
  3. vue+elementui搭建后台管理界面(登录)
  4. Intel Realsense D435 python 实战(二)
  5. 移动端取消iphone ipad默认按钮
  6. 聚类技术---复杂网络社团检测_基于Plato高性能图计算框架的社团发现算法
  7. 模拟linux内核异常,Linux内核异常
  8. Android:强制EditText删除焦点? [重复]
  9. Clojure 学习入门(4)- 字符串
  10. [转]前端HTML书写不得不掌握的Emmet缩写语法
  11. EF实体框架之CodeFirst五
  12. 【历史上的今天】8 月 21 日:谷歌创始人诞生;百度 360 搜索大战
  13. popToViewController:animated:的崩溃
  14. 用Maxima画出一些有趣的图
  15. 设备巡检的执行的痛点及解决方案
  16. 从零使用okhttp和gson解析聚合数据的新闻头条API
  17. 攻防世界(解密篇Crypto)---混合编码
  18. 从零开始的有刷电子调速器教程,高压大电流电调带回家
  19. 关于代码编辑器IDEA突然不能编辑文件的原因
  20. python怎么修改字体_python怎么改字体 | 基础教程

热门文章

  1. [CCC2022 J2] Fergusonball Ratings
  2. pvp服务器有什么项目,N服PVP服率先回归!压测后未来3-4周正式开服
  3. PHP发送邮件类库PHPMailer的简单使用 摘自 现代魔法研究协会
  4. 关于微信授权获取昵称含Emoji表情引发的乱码问题总结
  5. vsftp配置虚拟账户
  6. dns污染怎么快速清除解决
  7. walking机器人入门教程-单点导航
  8. 【无标题】Win10鼠标单击右键点击“显示设置”,“个性化”弹出该文件没有与之关联的程序来执行该操作。
  9. java获取指定日期当月和下个月的第一天
  10. ACM144-小柯的烦恼zy