17. 关于Service
17.1. Service的基本作用
Service是项目中非常重要的组件,用于设计业务流程、业务逻辑,以保障数据的完整性、有效性、安全性。
Service在代码中的的作用是调用Mapper、被Controller调用。
17.2. Service的规范
在《阿里巴巴Java手册》中的强制规约:
【强制】对于 Service 和 DAO 类,基于 SOA 的理念,暴露出来的服务一定是接口,内部
的实现类用 Impl 的后缀与接口区别。
正例:CacheServiceImpl 实现 CacheService 接口。
17.3. 关于Service接口中的方法
在Service接口中声明的抽象方法,应该:
- 返回值类型:仅以操作成功为前提来设计返回值类型
- 如果视为操作失败,可以通过抛出异常来表示
- 方法名称:自定义
- 参数列表:绝大部分情况下,以客户端会提交的请求参数作为参考,并且,可以按需封装,使用封装的POJO类型作为业务方法的参数
封装的类型 login(String username, String password) throws 用户名错误异常, 密码错误异常, 账号状态异常;
try {
封装的类型 xxx = service.login(xx,xx);
// 处理登录成功的后续操作
} catch (用户名错误异常 e) {
// 处理用户名错误的后续操作
} catch (密码错误异常 e) {
// 处理密码错误的后续操作
} catch (账号状态异常 e) {
// 处理账号状态错误的后续操作
}
17.4. 在Service中实现“添加相册”
在项目的根包下创建pojo.dto.AlbumAddNewDTO
类,用于封装业务方法所需的参数:
@Data
public class AlbumAddNewDTO implements Serializable {
private String name;
private String description;
private Integer sort;
}
再在项目的根包下创建service.IAlbumService
接口,并在接口添加“添加相册”的抽象方法:
public interface IAlbumService {
void addNew(AlbumAddNewDTO albumAddNewDTO);
}
再在项目的根包下创建service.impl.AlbumServiceImpl
类,实现以上接口,重写接口中声明的抽象方法:
public class AlbumServiceImpl implements IAlbumService {
@Override
public void addNew(AlbumAddNewDTO albumAddNewDTO) {
}
}
关于具体的实现,应该是:
@Service
public class AlbumServiceImpl implements IAlbumService {
@Autowired
private AlbumMapper albumMapper;