Java秒殺系統(tǒng)(二):構(gòu)建SpringBoot多模塊項(xiàng)目
作者:
修羅debug
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 by-sa 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
摘要:本篇博文是“Java秒殺系統(tǒng)實(shí)戰(zhàn)系列文章”的第二篇,主要分享介紹如何采用開發(fā)工具IDEA和Maven,基于SpringBoot+SpringMVC+Mybatis+分布式中間件構(gòu)建一個多模塊的項(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)建的思路如下圖所示:
詳細(xì)的構(gòu)建過程在本文就不贅述了!文末有提供源碼的地址以及構(gòu)建過程的視頻教程!下面重點(diǎn)介紹一下跟“Java秒殺系統(tǒng)”相關(guān)的構(gòu)建步驟。
(1)如下圖所示為最終構(gòu)建成功的項(xiàng)目的整體目錄結(jié)構(gòu):
從該目錄結(jié)構(gòu)中可以看出,該項(xiàng)目為一個“聚合型項(xiàng)目”,其中,model模塊依賴api模塊,server模塊依賴model模塊,層層依賴!最終在server模塊實(shí)現(xiàn)“大匯總”,即server模塊為整個項(xiàng)目的核心關(guān)鍵所在,像什么“配置文件”、“入口啟動類”啥的都在這個模塊中!
而且,各個模塊的職責(zé)是不一樣的,分工也很明確,就像model模塊,一般人看了就知道這里放的東西應(yīng)該是跟mybatis或者跟數(shù)據(jù)庫mysql相關(guān)的類文件與配置文件等等。
構(gòu)建好相應(yīng)的模塊之后,就需要往相應(yīng)的模塊添加依賴,即只需要在pom.xml中加入相應(yīng)的依賴即可,在這里就不貼出來了!
(2)在這里主要貼一下server模塊入口啟動類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);
}
}
其中,該啟動類將加載配置文件spring-jdbc.xml(數(shù)據(jù)庫鏈接信息的配置文件)!
構(gòu)建完成之后,可以將整個項(xiàng)目采用外置的Tomcat跑起來,運(yùn)行過程中,觀察控制臺Console的輸出信息,如果沒有報錯信息,則代表整個項(xiàng)目的搭建是沒有問題的!如果出現(xiàn)了問題,建議自己先研究一番并嘗試去解決掉!如果仍舊不能解決,可以加文末提供的聯(lián)系方式進(jìn)行解決!
(4)除此之外,為了讓整個項(xiàng)目在前后端分離開發(fā)的情況下,前后端的接口交互更加規(guī)范(比如響應(yīng)信息的規(guī)范等等),在這里我們采用了通用的一個狀態(tài)碼枚舉類StatusCode 跟 一個通用的響應(yīng)結(jié)果類BaseResponse,用于后端在返回響應(yīng)信息給到前端時進(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)碼對應(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;
}
}
在后面使用的過程中,大家會發(fā)現(xiàn),這個BaseResponse和StatusCode的結(jié)合使用會帶來很大的方便,而且,大家仔細(xì)觀察,會發(fā)現(xiàn)這種模式跟“HTTP的響應(yīng)模型”很像!
(5)最后,為了測試整個項(xiàng)目的可用性以及BaseResponse和StatusCode的使用,下面建立一個BaseController控制器,并在其中開發(fā)一個簡單的請求方法,如下所示:
@Controller
@RequestMapping("base")
public class BaseController {
private static final Logger log= LoggerFactory.getLogger(BaseController.class);
/**
* 標(biāo)準(zhǔn)請求-響應(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)將整個運(yùn)行起來,如果控制臺沒有相應(yīng)的報錯信息,則打開Postman,并發(fā)起相應(yīng)的請求:http://localhost:8092/kill/base/response?name=Java秒殺系統(tǒng) (端口跟上下文是自己設(shè)置的?。?,可以觀察響應(yīng)信息,如下所示:
(7)除此之外,這個Java秒殺系統(tǒng)項(xiàng)目還支持前端發(fā)起請求時,后端協(xié)助進(jìn)行頁面的跳轉(zhuǎn),其中本項(xiàng)目使用的模板引擎為Jsp,跳轉(zhuǎn)后的頁面位于/WEB-INF/views/目錄下(這主要是通過在application.properties文件配置實(shí)現(xiàn)的)。如下代碼為在BaseController開發(fā)一個跳轉(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)用場景,可以將其作為一個奠基項(xiàng)目來使用。
接下來,我們就可以開始干一些壞事了,即由此開啟“Java秒殺系統(tǒng)”的整體實(shí)戰(zhàn)之路!
補(bǔ)充:
1、目前,這一秒殺系統(tǒng)的整體構(gòu)建與代碼實(shí)戰(zhàn)已經(jīng)全部完成了,該秒殺系統(tǒng)對應(yīng)的視頻教程的鏈接地址為:https://www.fightjava.com/web/index/course/detail/6,可以點(diǎn)擊鏈接進(jìn)行試看以及學(xué)習(xí),實(shí)戰(zhàn)期間有任何問題都可以留言或者與Debug聯(lián)系、交流!
2、另外,Debug也開源了該秒殺系統(tǒng)對應(yīng)的完整的源代碼以及數(shù)據(jù)庫,其地址可以來這里下載:https://gitee.com/steadyjack/SpringBoot-SecondKill 記得Fork跟Star?。。。?/span>
3、最后,不要忘記了關(guān)注一下Debug的技術(shù)微信公眾號: