????????老規(guī)矩,文末給出代碼下載地址,如果你沒有查看先前的文章請先查看這個系列的前幾篇【畢竟前邊的是基礎(chǔ)】
????????實戰(zhàn)篇:基于SSM的秒殺系統(tǒng)之項目介紹
????????實戰(zhàn)篇:基于SSM的秒殺系統(tǒng)之項目搭建和數(shù)據(jù)庫設(shè)計
????????實戰(zhàn)篇:基于SSM的秒殺系統(tǒng)之DAO層搭建
????????通過上一篇的介紹,我們主要介紹了數(shù)據(jù)庫的相關(guān)操作,并沒有涉及到相關(guān)的業(yè)務(wù)邏輯操作,可以看出,在MVC模型當(dāng)中,分層觀念是很重要的,雖然不可能做到完全的分離,但是最大限度地分開可以降低耦合度,使代碼更加清晰,今天Service層主要來介紹與業(yè)務(wù)邏輯相關(guān)的操作。
Service接口的設(shè)計
????????Service接口的設(shè)計,一定要站在“使用者”的角度來看,不要以一個程序員的角度來看待這個問題,要考慮到實際的用戶的習(xí)慣,本著這個原則,這個系統(tǒng)的Service接口這樣進行設(shè)計
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設(shè)計
????????DTO是個什么東西呢?
DTO :
????????Data Transfer Object數(shù)據(jù)傳輸對象
????????主要用于遠(yuǎn)程調(diào)用等需要大量傳輸對象的地方。
????????比如我們一張表有100個字段,那么對應(yīng)的PO就有100個屬性。
????????但是我們界面上只要顯示10個字段,
????????客戶端用WEB service來獲取數(shù)據(jù),沒有必要把整個PO對象傳遞到客戶端,
????????這時我們就可以用只有這10個屬性的DTO來傳遞結(jié)果到客戶端,這樣也不會暴露服務(wù)端表結(jié)構(gòu)。
我們使用到的DTO有
Exposer暴露秒殺接口
// 是否開啟秒殺
private boolean exposed;
// 一種加密措施
private String md5;
// id
private long seckillId;
// 系統(tǒng)當(dāng)前時間(毫秒)
private long now;
// 開啟時間
private long start;
// 結(jié)束時間
private long end;
SeckillExecution秒殺執(zhí)行后的結(jié)果
private long seckillId;
// 秒殺執(zhí)行結(jié)果狀態(tài)
private int state;
// 狀態(tài)標(biāo)識
private String stateInfo;
// 秒殺成功對象
private SuccessKilled successKilled;
異常設(shè)計
????????在Service接口中我們可以看到我們拋出的異常都是自己定義的,這其實是為了提高程序的可讀性,所以我們設(shè)計了重復(fù)秒殺異常和秒殺關(guān)閉異常。
事務(wù)設(shè)計
在秒殺系統(tǒng)中,事務(wù)是最重要的一部分,由于秒殺系統(tǒng)對數(shù)據(jù)庫操作要求很高,所以我們采用聲明式事務(wù),Spring配置事務(wù)的方式有很多中,這里我們使用基于注解式的事務(wù)
使用注解控制事務(wù)方法的優(yōu)點:
1.開發(fā)團隊達(dá)成一致約定,明確標(biāo)注事務(wù)方法的編程風(fēng)格
2.保證事務(wù)方法的執(zhí)行時間盡可能短,不要穿插其他網(wǎng)絡(luò)操作,RPC/HTTP請求或者剝離到事務(wù)方法外部
3.不是所有的方法都需要事務(wù),如只有一條修改操作,只讀操作不需要事務(wù)控制
我們只需要在需要事務(wù)的方法上面加上@Transaction注解即可
最后貼出代碼的地址,如果你不明白歡迎交流