公告业务设计
业务描述
本章节通过对公告业务对象的分析,进行业务逻辑操作的具体设计和实现。
API 设计分析
说明,在这张图中我们从右侧向左看,最右边是数据层,中间是业务层,最左边是对业务层的测试。
代码设计及实现
业务接口设计
定义通知业务逻辑接口及相关方法,关键代码如下:
package com.cy.pj.sys.service;
import com.cy.pj.sys.pojo.SysNotice;
import java.util.List;
/**
* 此对象为通告业务逻辑对象负责对通告业务做具体落地实现
* 1)调用数据逻辑对象执行数据操作
* 2)日志记录
* 3)事务处理
* 4)缓存
* 5)权限
* 6).............
*/
public interface SysNoticeService {
/**
* 新增通告信息
* @param notice
* @return
*/
int saveNotice(SysNotice notice);
/**
* 基于条件查询通告信息
* @param notice
* @return
*/
List<SysNotice> selectNotices(SysNotice notice);
/**
* 基于通告删除通告信息
* @param ids
* @return
*/
int deleteById(Long… ids);
/**
* 基于id查询某条通告
* @param id
* @return
*/
SysNotice selectById(Long id);
/**
* 更新通告信息
* @param notice
* @return
*/
int updateNotice(SysNotice notice);
}
日志规约描述
日志是进行数据分析,异常分析的一种有效手段,我们在业务执行过程中对业务相关操作,进行日志记录是必须的一道程序。在进行日志的记录是,日志API选型也会影响到后续日志操作的可维护性和可扩展性。本次业务日志我们选择SLF4J,这是一套Java中基于门面模式而设计的一套日志API规范,其关键应用如下:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**创建日志门面API对象*/
private static final Logger log=
//通过工厂创建日志对象
LoggerFactory.getLogger(SysNoticeServiceImpl.class);
其中,SLF4J基于此标准的实现有logback,log4j等具体的实现,我们编程时,建议耦合与规范或标准进行日志记录。
业务实现类设计
定义通知业务逻辑接口的实现类,并重写业务方法,重写过程中对相关业务进行日志记录,关键代码如下:
package com.cy.pj.sys.service.impl;
import com.cy.pj.sys.dao.SysNoticeDao;
import com.cy.pj.sys.pojo.SysNotice;
import com.cy.pj.sys.service.SysNoticeService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @Service注解由spring提供,一般用于描述分层架构中的业务逻辑对象,这样的类
* 会交给spring管理
*/
@Service
public class SysNoticeServiceImpl implements SysNoticeService {
/**创建日志门面API对象*/
private static final Logger log=
//通过工厂创建日志对象
LoggerFactory.getLogger(SysNoticeServiceImpl.class);
@Autowired
private SysNoticeDao sysNoticeDao;
//重写方法的生成 (选中类,然后alt+enter)
@Override
public int saveNotice(SysNotice notice) {
int rows=sysNoticeDao.insertNotice(notice);
return rows;
}
@Override
public List<SysNotice> selectNotices(SysNotice notice) {
//System.out.println(
"system.out.start:"+System.currentTimeMillis());
log.debug("start: {}",System.currentTimeMillis());
//这里的{}表示占位符号
List<SysNotice> list=sysNoticeDao.selectNotices(notice);
log.debug("end: {}",System.currentTimeMillis());
return list;
}
@Override
public int deleteById(Long... ids) {
int rows= sysNoticeDao.deleteById(ids);
return rows;
}
@Override
public SysNotice selectById(Long id) {
SysNotice notice=sysNoticeDao.selectById(id);
return notice;
}
@Override
public int updateNotice(SysNotice notice) {
int rows=sysNoticeDao.updateNotice(notice);
return rows;
}
}
单元测试分析
定义单元测试类,对业务方法进行单元测试
package com.cy.pj.sys.service;
import com.cy.pj.sys.pojo.SysNotice;
import org.junit.jupiter.api.Test;
@SpringBootTest
public class SysNoticeServiceTests {
@Autowired
private SysNoticeService sysNoticeService;
@Test void testFindNotices(){
SysNotice notice=new SysNotice();
notice.setType("1");
notice.setModifiedUser("tony");
sysNoticeService.selectNotices(notice);
}
}
总结(Summary)
重难点分析
分层架构中service是如何定义的?
公告业务接口及方法的设计
公告业务实现与公告数据层接口的关系
FAQ分析
@Service注解是谁定义的,有什么作用?
为什么要记录日志,一般都会记录什么信息?
@Service描述的类中是如何应用日志API的?
你知道哪些日志级别,在哪里进行配置?
日志要写到文件的基本配置是什么?
….
Bug分析
NoSuchBeanDefinitionException
NullPointerException
….