业务逻辑层-Service
Service的开发规范是先写接口,再写实现类。
通常,会在项目的根包下创建service
子包,Service接口将存放在这个包中,并且,还会在service
包下创建impl
子包,Service实现类都将放在这个包中,实现类都会使用ServiceImpl
作为类名的后缀。
例如:在项目的根包下创建service.IAlbumService
接口,然后,再创建service.impl.AlbumServiceImpl
类,且此类将实现IAlbumService
接口。
为了保证项目启动时可以正确的创建此实现类,需要类上添加@Service
注解。
package cn.tedu.csmall.product.service;
public interface IAlbumService {
}
package cn.tedu.csmall.product.service.impl;
import cn.tedu.csmall.product.service.IAlbumService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class AlbumServiceImpl implements IAlbumService {
public AlbumServiceImpl() {
log.info("创建业务对象:AlbumServiceImpl");
}
}
假设需要实现:添加相册。
则在接口中添加抽象方法,关于抽象方法的设计:
- 返回值类型:当客户端提交了相应的请求到服务器端,业务逻辑层正确的处理了数据后,是否需要返回某个数据(设计返回值类型时,不需要考虑失败的情况,因为将通过抛出异常来表示失败)
- 方法名称:自定义
- 参数列表:所有应该由客户端提交的数据属性
void addNew(AlbumAddNewDTO albumAddNewDTO);
然后,在实现类中:
@Override
public void addNew(AlbumAddNewDTO albumAddNewDTO) {
log.debug("开始处理【添加相册】的业务,参数:{}", albumAddNewDTO);
// 调用AlbumMapper对象的int countByName(String name)方法统计此名称的相册的数量
String name = albumAddNewDTO.getName();
int countByName = albumMapper.countByName(name);
log.debug("尝试添加的相册名称是:{},在数据库中此名称的相册数量为:{}", name, countByName);
// 判断统计结果是否大于0
if (countByName > 0) {
// 是:相册名称已经存在,抛出RuntimeException异常
String message = "添加相册失败!相册名称【" + name + "】已存在!";
log.warn(message);
throw new RuntimeException(message);
}
// 获取当前时间:LocalDateTime now = LocalDateTime.now()
LocalDateTime now = LocalDateTime.now();
// 创建Album对象
Album album = new Album();
// 补全Album对象中各属性的值:name:来自参数
// 补全Album对象中各属性的值:description:来自参数
// 补全Album对象中各属性的值:sort:来自参数
BeanUtils.copyProperties(albumAddNewDTO, album);
// 补全Album对象中各属性的值:gmtCreate:now
album.setGmtCreate(now);
// 补全Album对象中各属性的值:gmtModified:now
album.setGmtModified(now);
// 调用AlbumMapper对象的int insert(Album album)方法插入相册数据
log.debug("即将向数据库中插入数据:{}", album);
albumMapper.insert(album);
}