????????老規(guī)矩,文末給出代碼下載地址张遭,如果你沒有查看先前的文章請先查看這個系列的前幾篇【畢竟前邊的是基礎】
????????實戰(zhàn)篇:基于SSM的秒殺系統(tǒng)之項目介紹
????????實戰(zhàn)篇:基于SSM的秒殺系統(tǒng)之項目搭建和數(shù)據(jù)庫設計
????????實戰(zhàn)篇:基于SSM的秒殺系統(tǒng)之DAO層搭建
????????通過上一篇的介紹莽龟,我們主要介紹了數(shù)據(jù)庫的相關操作蠕嫁,并沒有涉及到相關的業(yè)務邏輯操作,可以看出毯盈,在MVC模型當中剃毒,分層觀念是很重要的,雖然不可能做到完全的分離搂赋,但是最大限度地分開可以降低耦合度赘阀,使代碼更加清晰,今天Service層主要來介紹與業(yè)務邏輯相關的操作脑奠。
Service接口的設計
????????Service接口的設計基公,一定要站在“使用者”的角度來看,不要以一個程序員的角度來看待這個問題宋欺,要考慮到實際的用戶的習慣轰豆,本著這個原則,這個系統(tǒng)的Service接口這樣進行設計
public interface SeckillService {
/**
* 查詢所有秒殺記錄
*
*/
List<Seckill> getSeckillList();
/**
* 查詢單個秒殺記錄
*/
Seckill getById(long seckillId);
/**
* 秒殺開啟時輸出秒殺接口地址齿诞,否則輸出系統(tǒng)時間和秒殺時間
*/
Exposer exportSeckillUrl(long seckillId);
/**
* 執(zhí)行秒殺操作
*/
SeckillExecution executeSeckill(long seckillId, long userPhone, String md5)
throws SeckillException, RepeatKillException, SeckillCloseException;
}
????????簡單介紹一下這個接口酸休,其中“輸出秒殺接口”的方法是為了防止用戶惡意拼接地址而提前進行購買,executeSeckill則是整個秒殺活動的入口
DTO設計
????????DTO是個什么東西呢祷杈?
DTO :
????????Data Transfer Object數(shù)據(jù)傳輸對象
????????主要用于遠程調用等需要大量傳輸對象的地方雨席。
????????比如我們一張表有100個字段,那么對應的PO就有100個屬性吠式。
????????但是我們界面上只要顯示10個字段陡厘,
????????客戶端用WEB service來獲取數(shù)據(jù),沒有必要把整個PO對象傳遞到客戶端特占,
????????這時我們就可以用只有這10個屬性的DTO來傳遞結果到客戶端糙置,這樣也不會暴露服務端表結構。
我們使用到的DTO有
Exposer暴露秒殺接口
// 是否開啟秒殺
private boolean exposed;
// 一種加密措施
private String md5;
// id
private long seckillId;
// 系統(tǒng)當前時間(毫秒)
private long now;
// 開啟時間
private long start;
// 結束時間
private long end;
SeckillExecution秒殺執(zhí)行后的結果
private long seckillId;
// 秒殺執(zhí)行結果狀態(tài)
private int state;
// 狀態(tài)標識
private String stateInfo;
// 秒殺成功對象
private SuccessKilled successKilled;
異常設計
????????在Service接口中我們可以看到我們拋出的異常都是自己定義的是目,這其實是為了提高程序的可讀性谤饭,所以我們設計了重復秒殺異常和秒殺關閉異常。
事務設計
在秒殺系統(tǒng)中,事務是最重要的一部分揉抵,由于秒殺系統(tǒng)對數(shù)據(jù)庫操作要求很高亡容,所以我們采用聲明式事務,Spring配置事務的方式有很多中冤今,這里我們使用基于注解式的事務
使用注解控制事務方法的優(yōu)點:
1.開發(fā)團隊達成一致約定闺兢,明確標注事務方法的編程風格
2.保證事務方法的執(zhí)行時間盡可能短,不要穿插其他網(wǎng)絡操作戏罢,RPC/HTTP請求或者剝離到事務方法外部
3.不是所有的方法都需要事務屋谭,如只有一條修改操作,只讀操作不需要事務控制
我們只需要在需要事務的方法上面加上@Transaction注解即可
最后貼出代碼的地址龟糕,如果你不明白歡迎交流