CSDN参考:Java高并发秒杀API(二)之Service层
0.说明
本篇文章根据我自己的编程理解,结合参考的博客对该项目Service层进行分析与补充。
1.新加入的包说明
dto:数据传输层,用于Web层和Service层之间传递的数据封装。
exception:service层中会出现的异常。
service:针对业务的服务。这里我们定义SeckillService接口。
service.impl:具体实现。
enums:这个包下是秒杀状态的说明值。用一个枚举表示。
2.DTO
Exposer 用于封装秒杀的地址信息。
SeckillExecution 用于封装秒杀是否成功的结果(该对象用来返回给页面)。
3.Exception
重复秒杀异常,秒杀关闭异常。这两个继承自我们自定义的秒杀异常。
4.Service
SeckillService接口定义了以下方法
-
List<Seckill> getSeckillList();查询全部的秒杀记录
-
Seckill getById(long seckillId);查询单个秒杀记录
-
Exposer exportSeckillUrl(long seckillId);在秒杀开启时输出秒杀接口的地址,否则输出系统时间和秒杀时间
-
SeckillExecution executeSeckill(long seckillId, long userPhone, String md5) throws SeckillException, RepeatKillException, SeckillCloseException;执行秒杀操作,有可能失败,有可能成功,所以要抛出我们允许的异常
5.SpringIoC注入方式和场景
XML | 三方类库,命名空间的配置(比如说c-命名空间等) |
注解 | 项目中自身开发使用的类 |
Java配置类 | 通过代码控制对象,创建逻辑的场景 |
本项目中IoC使用:通过xml配置package-sacn扫描包下注解。
6.关于Spring声明式事务
什么是声明式事物?
开启事务->修改SQL1-、修改SQL2、...、修改SQLN->提交/回滚事务
其中修改SQL这些都是解脱事务代码。
关于对tx:advice+aop命名空间使用Spring声明式事物的说明:
比如:所有service以add、update、execute开头的方法都是事物方法。Spring会为其自动添加事物控制逻辑。
7.什么时候回滚事务
RuntimeException才会回滚。
非运行时异常会部分成功部分不失败,因此要小心不当的try-catch。
8.总结
真正的核心其实是Service包。基于可能会出现的异常加入了exception,为了判断操作结果类型加入了enums,为了向前端返回数据加入了dto。
Service直接调用Dao层,完整了自下而上的组合。