参考博客
参考博客
参考博客
参考博客
参考博客
雷神讲解P76
阿里巴巴编码规约
参考博客
一、领域对象模型的个人理解及使用
1.entity
为实体类,每一个字段与数据库中的字段相对应。此目录下的类命名示例:User
2.dto
可做接口入参类(只封装需要传的入参字段即可)。此目录下的类命名示例:UserDto
- 是用来转换从
entity
到vo
,或者从vo
到entity
的中间的类。 - 可做入参校验,字段上添加注解如
@NotBlank
。每个接口一个dto
类做为入参类,避免给实体类直接加校验注解,遵循隔离原则及单一职责原则。 - 很多开源框架接口的入参直接为实体类,个人认为不好(但确实省事)。
3.vo
是要返回给前端的数据封装类,和你前端 html 页面的字段相对应。此目录下的类命名示例:UserVo
- 如需要添加字段,则可先复制实体类中的字段(不建议继承),再添加所需要的字段即可。
- 也可减少字段,如密码等敏感字段不向外暴露。
4.to
用于两个服务间的远程调用。此目录下的类命名示例:UserTo
- A服务调用B服务的方法(需要传一些数据),我们可以把这些数据封装成一个对象,特别在SpringCloud里面,我们封装的对象要给B服务传,SpringCloud会把to(我们刚才封装的对象)转换成一个json,然后B服务会收到这个json数据对象,也就是说这个封装数据的to对象是A、B服务都要用的(A、B服务的to对象前都要加@RequestBody),所以我们把to放在common公共服务(新建一个to目录)中。
- 为了开发方便,我们通常是把被调方B服务的方法头部直接贴到A服务的远程调用服务中。
- 只要json数据模型是兼容的。双方服务无需使用同一个to(使用同一个是为了开发快速方便)。
举例:
Controller层:
@Autowired
private UserService userService;
public R getUsers(UserDTO userDto) {
User user = userService.getUser(userDto);
UserVo vo = new UserVo();
BeanUtils.copyProperties(user, vo); // 字段名称必须对应才能属性对拷
return R.ok().put("data", vo);
}
Service层:
@Autowired
private UserDao userDao;
public User getUser(UserDTO userDto) {
User user = userDao.selectById(userDto.getId());
return user;
}
二、开发技巧
1.类和类相互转换时借助Spring中的BeanUtils.copyProperties()
方法相互转换即可。
2.接口规范
- controller:处理请求,接收和校验数据。
- service:接收controller传来的数据,进行业务处理。
- controller接收service处理完的数据,封装成页面指定的vo返回。
- 在controller封装成页面指定的vo的原因:为了service层的方法复用(service直接返回vo类型会影响别的地方复用)。