背景
在日常的工作中,我们经常会发现很多项目的业务处理逻辑都放在controller中,导致service除了调用dao获取数据之外没有任何逻辑,以我们要获取用户信息为例,以下是错误示例。
获取用户信息的简单 controller:
@Slf4j
@Controller
public class DemoController {
@Autowired
DemoService demoService;
@GetMapping("/demo")
@ResponseBody
public 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 {
@Resource
DemoDao demoDao;
@Override
public 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;
}
}
相信以上形式的代码存在于各种项目内,由此引发思考
- controller的职责究竟是什么?
- service的职责又是什么?
- dao呢?
controller 控制器
新华字典释义
【控制】:掌握住不使任意活动或越出范围。
说明控制器的作用是不允许用户任意执行业务逻辑,对应到controller,我们应该认为controller的职责为如下几点
- 谁可以执行?
- 接口入参满足执行业务的必要条件吗?
- 这个请求是机器人发起的吗?
- 需要满足执行业务的其他条件等
由以上思考我们可以知道controller并不是真正的业务逻辑,而只能作为service的上游判断请求能否执行真正的业务逻辑。
service 服务
新华字典释义
【服务】:为集体(或别人的)利益或为某种事业而工作。
从计算机的角度来看,服务的作用就是真正提供业务实现的代码逻辑而不包含数据校验等与实际业务无关的逻辑。如:获取用户信息,存取款等。
dao (Data Access Object) 数据访问对象
新华字典释义
【访问】:1.有目的地去探望人并跟他谈话:~先进工作者。我怀着崇敬的心情,~了这座英雄的城市。
2.指进入计算机网络,在网站上浏览信息、查阅资料。
我们可以看出,访问在计算机系统内的含义为Read,也就是说我们在使用DAO查询数据的时候并不能对数据做任何更改,否则就破坏了访问的含义。
最后正确的示例如下:
controller
@Slf4j
@Controller
public class DemoController {
@Autowired
DemoService demoService;
@GetMapping("/demo")
@ResponseBody
public User demo(Integer userId) {
//检查用户ID是否合法
this.checkUserId(userId);
return this.demoService.getUser(userId);
}
}
获取用户信息的简单 service:
@Service
public class DemoServiceImpl implements DemoService {
@Resource
DemoDao demoDao;
@Override
public 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);
}
}