公告业务设计
业务描述
本章节通过对公告业务对象的分析,进行业务逻辑操作的具体设计和实现。

API 设计分析

java的springboot的业务层 数据是一块提交到数据库 springboot业务逻辑写在哪里_业务逻辑

说明,在这张图中我们从右侧向左看,最右边是数据层,中间是业务层,最左边是对业务层的测试。

代码设计及实现

业务接口设计
定义通知业务逻辑接口及相关方法,关键代码如下:

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
….