首先在编写Service层代码前,我们应该首先要知道这一层到底是干什么的。
Service层主要负责业务模块的逻辑应用设计。同样是首先设计接口,再设计其实现的类,接着在Spring的配置文件中配置其实现的关联。这样我们就可以在应用中调用Service接口来进行业务处理。Service层的业务实现,具体要调用到已定义的dao层的接口,封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性,程序显得非常简洁。
在项目中要降低耦合的话,分层是一种很好的概念,就是各层各司其职,尽量不做不相干的事,所以Service层的话顾名思义就是业务逻辑,处理程序中的一些业务逻辑,以及调用dao层的代码,这里我们的dao层就是连接数据库的那一层,调用关系可以这样表达:
View(页面) > Controller(控制层) > Service(业务逻辑) > Dao(数据访问) > Database(数据库)
首先还是接口的设计,设计秒杀商品的接口,在com.nnngu.service.interfaces包下建立SeckillService.java接口文件,如下图:
SeckillService.java文件里面的内容请参照项目的源代码。
建立好接口之后我们要写实现类了,在写实现类的时候我们肯定会碰到一个这样的问题,你要向前端返回json数据的话,你是返回什么样的数据好?直接返回一个数字状态码或者文字?这样设计肯定是不好的,所以我们应该向前端返回一个实体信息json,里面包含了一系列的信息,无论是哪种状态都应该可以应对,既然是与数据库字段无关的类,那就不是PO了,所以我们建立一个DTO数据传输类。关于常见的几种对象我的解释如下:
PO:也就是我们为每一张数据库表写一个实体类
VO:对某个页面或者展现层所需要的数据,封装成一个实体类
BO:业务对象
DTO:跟VO的概念有点混淆,也是相当于页面需要的数据封装成一个实体类
POJO:简单的无规则java对象
在com.nnngu下建立dto包,然后建立Exposer类,这个类是秒杀时数据库那边处理的结果的对象
Exposer.java文件里面的内容请参照项目的源代码。
定义秒杀中可能会出现的异常定义一个基础的异常,所有的子异常继承这个异常SeckillException
package com.nnngu.exception; /** * 秒杀基础的异常 * Created by nnngu */ public class SeckillException extends RuntimeException { // 代码省略,请参照项目的源代码 ... ... }