zoukankan      html  css  js  c++  java
  • Java秒杀系统实战系列~构建SpringBoot多模块项目

    摘要:本篇博文是“Java秒杀系统实战系列文章”的第二篇,主要分享介绍如何采用IDEA,基于SpringBoot+SpringMVC+Mybatis+分布式中间件构建一个多模块的项目,即“秒杀系统”!。

    内容:传统的基于IDEA构建SpringBoot的项目,是直接借助Spring Initializr插件进行构建,但是这种方式在大部分情况下,只能充当“单模块”的项目,并不能很好的做到“分工明确、职责清晰”的分层原则!

    故而为了能更好的管理项目代码以及尽量做到“模块如名”,快速定位给定的类文件或者其他文件的位置,下面我们将基于IDEA、借助Maven构建多模块的项目,其中,其构建的思路如下图所示:

    详细的构建过程在本文就不赘述了!文末有提供源码的地址以及构建过程的视频教程!下面重点介绍一下跟“Java秒杀系统”相关的构建步骤。

    (1)如下图所示为最终构建成功的项目的整体目录结构:   

    从该目录结构中可以看出,该项目为一个“聚合型项目”,其中,model模块依赖api模块,server模块依赖model模块,层层依赖!最终在server模块实现“大汇总”,即server模块为整个项目的核心关键所在,像什么“配置文件”、“入口启动类”啥的都在这个模块中!

    而且,各个模块的职责是不一样的,分工也很明确,就像model模块,一般人看了就知道这里放的东西应该是跟mybatis或者跟数据库mysql相关的类文件与配置文件等等。

    构建好相应的模块之后,就需要往相应的模块添加依赖,即只需要在pom.xml中加入相应的依赖即可,在这里就不贴出来了!

    (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(数据库链接信息的配置文件)!

    构建完成之后,可以将整个项目采用外置的Tomcat跑起来,运行过程中,观察控制台Console的输出信息,如果没有报错信息,则代表整个项目的搭建是没有问题的!如果出现了问题,建议自己先研究一番并尝试去解决掉!如果仍旧不能解决,可以加文末提供的联系方式进行解决!

    (4)除此之外,为了让整个项目在前后端分离开发的情况下,前后端的接口交互更加规范(比如响应信息的规范等等),在这里我们采用了通用的一个状态码枚举类StatusCode 跟 一个通用的响应结果类BaseResponse,用于后端在返回响应信息给到前端时进行统一封装。

    状态码枚举类StatusCode的源代码如下所示:

    public enum StatusCode {

        Success(0,"成功"),

        Fail(-1,"失败"),

        InvalidParams(201,"非法的参数!"),

        UserNotLogin(202,"用户没登录"),

        ;

        private Integer code; //状态码code

        private String msg;  //状态码描述信息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;

        }

    }

    响应结果类BaseResponse的源代码如下所示:

    public class BaseResponse<T> {

        private Integer code; //状态码code

        private String msg;  //状态码对应的描述信息msg

        private T data; //响应数据

        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;

        }

    }

    在后面使用的过程中,大家会发现,这个BaseResponse和StatusCode的结合使用会带来很大的方便,而且,大家仔细观察,会发现这种模式跟“HTTP的响应模型”很像!

    (5)最后,为了测试整个项目的可用性以及BaseResponse和StatusCode的使用,下面建立一个BaseController控制器,并在其中开发一个简单的请求方法,如下所示:

    @Controller

    @RequestMapping("base")

    public class BaseController {

        private static final Logger log= LoggerFactory.getLogger(BaseController.class);

        /**

         * 标准请求-响应数据格式

         */

        @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)将整个运行起来,如果控制台没有相应的报错信息,则打开Postman,并发起相应的请求:http://localhost:8092/kill/base/response?name=Java秒杀系统 (端口跟上下文是自己设置的!),可以观察响应信息,如下所示:

    (7)除此之外,这个Java秒杀系统项目还支持前端发起请求时,后端协助进行页面的跳转,其中本项目使用的模板引擎为Jsp,跳转后的页面位于/WEB-INF/views/目录下(这主要是通过在application.properties文件配置实现的)。

    如下代码为在BaseController开发一个跳转到welcome页面的方法,其代码如下所示:

    /**

     * 跳转页面-跳转成功携带 name 参数到 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秒杀系统 即可跳转到相应的页面!

    至此,关于“Java秒杀系统”多模块项目的构建已经完成了!值得一提的是,这一多模块项目可以适用于其他任何SpringBoot业务的应用场景,可以将其作为一个奠基项目来使用。

    接下来,我们就可以开始干一些坏事了,即由此开启“Java秒杀系统”的整体实战之路!

    补充

    1、目前,这一秒杀系统的整体构建与代码实战已经全部完成了,完整的源代码数据库地址可以来这里下载:https://gitee.com/steadyjack/SpringBoot-SecondKill 记得Fork跟Star啊!!!

    2、由于相应的博客的更新可能并不会很快,故而如果有想要快速入门以及实战整套系统的,可以考虑购买这套系统对应的实战视频教程:https://www.roncoo.com/view/1146338929757712386

  • 相关阅读:
    读取xml文件(可执行文件根目录debug)
    c# winform textbox与combox让用户不能输入
    枚举类型
    值类型与引用类型
    error: failed to push some refs to 'https://git.oschina.net/bluede/TuShuGuanLi.g it'
    left join on 和where中条件的放置位置
    left join、right join、inner join、full join
    Union、Union All、Intersect、Minus
    分层设计的好处
    Hibernate查询方式
  • 原文地址:https://www.cnblogs.com/lishiqi-blog/p/11194693.html
Copyright © 2011-2022 走看看