實戰(zhàn)篇:基于SSM的秒殺系統(tǒng)之Service層搭建

????????老規(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注解即可
最后貼出代碼的地址,如果你不明白歡迎交流

https://github.com/lctiter/seckill

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容