Java商城秒殺系統(tǒng)實(shí)戰(zhàn)系列~構(gòu)建SpringBoot多模塊項(xiàng)目

摘要:本篇博文是“Java秒殺系統(tǒng)實(shí)戰(zhàn)系列文章”的第二篇,主要分享介紹如何采用IDEA钝吮,基于SpringBoot+SpringMVC+Mybatis+分布式中間件構(gòu)建一個(gè)多模塊的項(xiàng)目,即“秒殺系統(tǒng)”乔夯!盟步。

內(nèi)容:傳統(tǒng)的基于IDEA構(gòu)建SpringBoot的項(xiàng)目,是直接借助Spring Initializr插件進(jìn)行構(gòu)建著淆,但是這種方式在大部分情況下,只能充當(dāng)“單模塊”的項(xiàng)目拴疤,并不能很好的做到“分工明確永部、職責(zé)清晰”的分層原則!

故而為了能更好的管理項(xiàng)目代碼以及盡量做到“模塊如名”呐矾,快速定位給定的類文件或者其他文件的位置苔埋,下面我們將基于IDEA、借助Maven構(gòu)建多模塊的項(xiàng)目蜒犯,其中组橄,其構(gòu)建的思路如下圖所示:

image

詳細(xì)的構(gòu)建過程在本文就不贅述了!文末有提供源碼的地址以及構(gòu)建過程的視頻教程罚随!下面重點(diǎn)介紹一下跟“Java秒殺系統(tǒng)”相關(guān)的構(gòu)建步驟晨炕。

(1)如下圖所示為最終構(gòu)建成功的項(xiàng)目的整體目錄結(jié)構(gòu):

image

從該目錄結(jié)構(gòu)中可以看出,該項(xiàng)目為一個(gè)“聚合型項(xiàng)目”毫炉,其中,model模塊依賴api模塊削罩,server模塊依賴model模塊瞄勾,層層依賴!最終在server模塊實(shí)現(xiàn)“大匯總”弥激,即server模塊為整個(gè)項(xiàng)目的核心關(guān)鍵所在进陡,像什么“配置文件”、“入口啟動(dòng)類”啥的都在這個(gè)模塊中微服!

而且趾疚,各個(gè)模塊的職責(zé)是不一樣的,分工也很明確以蕴,就像model模塊糙麦,一般人看了就知道這里放的東西應(yīng)該是跟mybatis或者跟數(shù)據(jù)庫mysql相關(guān)的類文件與配置文件等等。

構(gòu)建好相應(yīng)的模塊之后丛肮,就需要往相應(yīng)的模塊添加依賴赡磅,即只需要在pom.xml中加入相應(yīng)的依賴即可,在這里就不貼出來了宝与!

(2)在這里主要貼一下server模塊入口啟動(dòng)類MainApplication的代碼焚廊,如下所示:

@SpringBootApplication
@ImportResource(value = {"classpath:spring/spring-jdbc.xml"})
@MapperScan(basePackages = "com.debug.kill.model.mapper")
@EnableScheduling
public class MainApplication extends SpringBootServletInitializer{

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(MainApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class,args);
    }
}

其中冶匹,該啟動(dòng)類將加載配置文件spring-jdbc.xml(數(shù)據(jù)庫鏈接信息的配置文件)!

構(gòu)建完成之后咆瘟,可以將整個(gè)項(xiàng)目采用外置的Tomcat跑起來嚼隘,運(yùn)行過程中,觀察控制臺(tái)Console的輸出信息袒餐,如果沒有報(bào)錯(cuò)信息飞蛹,則代表整個(gè)項(xiàng)目的搭建是沒有問題的!如果出現(xiàn)了問題匿乃,建議自己先研究一番并嘗試去解決掉桩皿!如果仍舊不能解決,可以加文末提供的聯(lián)系方式進(jìn)行解決幢炸!

(4)除此之外泄隔,為了讓整個(gè)項(xiàng)目在前后端分離開發(fā)的情況下,前后端的接口交互更加規(guī)范(比如響應(yīng)信息的規(guī)范等等)宛徊,在這里我們采用了通用的一個(gè)狀態(tài)碼枚舉類StatusCode 跟 一個(gè)通用的響應(yīng)結(jié)果類BaseResponse佛嬉,用于后端在返回響應(yīng)信息給到前端時(shí)進(jìn)行統(tǒng)一封裝。

狀態(tài)碼枚舉類StatusCode的源代碼如下所示:

public enum StatusCode {
    Success(0,"成功"),
    Fail(-1,"失敗"),
    InvalidParams(201,"非法的參數(shù)!"),
    UserNotLogin(202,"用戶沒登錄"),
    ;
    private Integer code; //狀態(tài)碼code
    private String msg;  //狀態(tài)碼描述信息msg

    StatusCode(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
}

響應(yīng)結(jié)果類BaseResponse的源代碼如下所示:

public class BaseResponse<T> {
    private Integer code; //狀態(tài)碼code
    private String msg;  //狀態(tài)碼對(duì)應(yīng)的描述信息msg
    private T data; //響應(yīng)數(shù)據(jù)
    public BaseResponse(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    public BaseResponse(StatusCode statusCode) {
        this.code = statusCode.getCode();
        this.msg = statusCode.getMsg();
    }
    public BaseResponse(Integer code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
}

在后面使用的過程中闸天,大家會(huì)發(fā)現(xiàn)暖呕,這個(gè)BaseResponse和StatusCode的結(jié)合使用會(huì)帶來很大的方便,而且苞氮,大家仔細(xì)觀察湾揽,會(huì)發(fā)現(xiàn)這種模式跟“HTTP的響應(yīng)模型”很像!

(5)最后笼吟,為了測(cè)試整個(gè)項(xiàng)目的可用性以及BaseResponse和StatusCode的使用库物,下面建立一個(gè)BaseController控制器,并在其中開發(fā)一個(gè)簡(jiǎn)單的請(qǐng)求方法贷帮,如下所示:

@Controller
@RequestMapping("base")
public class BaseController {
    private static final Logger log= LoggerFactory.getLogger(BaseController.class);
    /**
     * 標(biāo)準(zhǔn)請(qǐng)求-響應(yīng)數(shù)據(jù)格式
     */
    @RequestMapping(value = "/response",method = RequestMethod.GET)
    @ResponseBody
    public BaseResponse response(String name){
        BaseResponse response=new BaseResponse(StatusCode.Success);
        if (StringUtils.isBlank(name)){
            name="這是welcome!";
        }
        response.setData(name);
        return response;
    }
}

(6)將整個(gè)運(yùn)行起來戚揭,如果控制臺(tái)沒有相應(yīng)的報(bào)錯(cuò)信息,則打開Postman撵枢,并發(fā)起相應(yīng)的請(qǐng)求:http://localhost:8092/kill/base/response?name=Java秒殺系統(tǒng)(端口跟上下文是自己設(shè)置的C裆埂),可以觀察響應(yīng)信息锄禽,如下所示:

image

(7)除此之外潜必,這個(gè)Java秒殺系統(tǒng)項(xiàng)目還支持前端發(fā)起請(qǐng)求時(shí),后端協(xié)助進(jìn)行頁面的跳轉(zhuǎn)沃但,其中本項(xiàng)目使用的模板引擎為Jsp刮便,跳轉(zhuǎn)后的頁面位于/WEB-INF/views/目錄下(這主要是通過在application.properties文件配置實(shí)現(xiàn)的)。如下代碼為在BaseController開發(fā)一個(gè)跳轉(zhuǎn)到welcome頁面的方法绽慈,其代碼如下所示:

/**
* 跳轉(zhuǎn)頁面-跳轉(zhuǎn)成功攜帶 name 參數(shù)到 welcome頁面中
* @param name
* @param modelMap
* @return
*/
@GetMapping("/welcome")
public String welcome(String name, ModelMap modelMap){
  if (StringUtils.isBlank(name)){
      name="這是welcome!";
  }
  modelMap.put("name",name);
  return "welcome";
}

(8)打開瀏覽器恨旱,訪問:http://localhost:8092/kill/base/welcome?name=Java秒殺系統(tǒng)即可跳轉(zhuǎn)到相應(yīng)的頁面辈毯!至此,關(guān)于“Java秒殺系統(tǒng)”多模塊項(xiàng)目的構(gòu)建已經(jīng)完成了搜贤!值得一提的是谆沃,這一多模塊項(xiàng)目可以適用于其他任何SpringBoot業(yè)務(wù)的應(yīng)用場(chǎng)景,可以將其作為一個(gè)奠基項(xiàng)目來使用仪芒。

接下來唁影,我們就可以開始干一些壞事了,即由此開啟“Java秒殺系統(tǒng)”的整體實(shí)戰(zhàn)之路掂名!

補(bǔ)充

1据沈、目前,這一秒殺系統(tǒng)的整體構(gòu)建與代碼實(shí)戰(zhàn)已經(jīng)全部完成了饺蔑,完整的源代碼數(shù)據(jù)庫地址可以來這里下載:https://gitee.com/steadyjack/SpringBoot-SecondKill 記得Fork跟Star靶拷椤!;孔祸!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市发皿,隨后出現(xiàn)的幾起案子崔慧,更是在濱河造成了極大的恐慌,老刑警劉巖穴墅,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惶室,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡玄货,警方通過查閱死者的電腦和手機(jī)拇涤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來誉结,“玉大人,你說我怎么就攤上這事券躁〕涂樱” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵也拜,是天一觀的道長(zhǎng)以舒。 經(jīng)常有香客問我,道長(zhǎng)慢哈,這世上最難降的妖魔是什么蔓钟? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮卵贱,結(jié)果婚禮上滥沫,老公的妹妹穿的比我還像新娘侣集。我一直安慰自己,他們只是感情好兰绣,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布世分。 她就那樣靜靜地躺著,像睡著了一般缀辩。 火紅的嫁衣襯著肌膚如雪臭埋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天臀玄,我揣著相機(jī)與錄音瓢阴,去河邊找鬼。 笑死健无,一個(gè)胖子當(dāng)著我的面吹牛荣恐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播睬涧,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼募胃,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了畦浓?” 一聲冷哼從身側(cè)響起痹束,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎讶请,沒想到半個(gè)月后祷嘶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夺溢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年论巍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片风响。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘉汰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出状勤,到底是詐尸還是另有隱情鞋怀,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布持搜,位于F島的核電站密似,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏葫盼。R本人自食惡果不足惜残腌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抛猫,春花似錦蟆盹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至掖看,卻和暖如春匣距,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哎壳。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工毅待, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人归榕。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓尸红,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親刹泄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子外里,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359