当前位置: 首页 > news >正文

知识点18--springboot多模块开发

本篇向大家介绍本系列demo教程中最后一个知识点就是多模块开发,多模块听着高大上,其实就是依靠maven相互之间的依赖,把多个模块融合进一个项目中而已,说的再直白一些就是像日常开发那样把其他模块导入一个模块,这个模块用来启动并调用所有模块而已。下面通过一个例子整体走一遍模块化开发。

第一步:建立父工程,注意通常情况下,父工程一定是一个spring initializr模式下创建出来的,但同样存在少量的人会先创建maven在转换成spring boot项目,这个其实就是手动添加所有依赖而已。
在这里插入图片描述
在这里插入图片描述
建好的项目结构默认是下面这个样子
在这里插入图片描述
但是模块化开发,整体上需要一个父工程,所以我们需要把现在的项目结构中写代码的资源目录删掉
在这里插入图片描述
第二步:建立子项目为模块,我们总共创建三个子模块,commons为公共模块,service为Service功能模块,web为Controller功能以及启动模块,因此在依赖关系上组成web依赖于service,service依赖commons

在父项目名上右键单击创建module
在这里插入图片描述
子模块创建的时候,你分清楚使用maven模式还是spring initializr,因为如果用spring initializr创建的是一个完整相对独立的springboot项目,它的父子关系、jar依赖以及作为子模块有一些东西是不需要的这些你都要自己操作,而maven创建就比较方便
在这里插入图片描述

maven项目可以直接选择父工程
在这里插入图片描述
commons是一个公共包它不需要任何的支持,所以它的项目结构很简洁
在这里插入图片描述
下面我们创建service模块
在这里插入图片描述
在这里插入图片描述
最后是web模块,不过由于web模块还负责则启动项目的功能,因此我们要用spring initializr创建一个相对完整的springboot项目
在这里插入图片描述
在这里插入图片描述
由于不是maven创建,所以需要手动维护父子项目关系,在web模块pom中修改parent标签为父项目

<parent>
    <artifactId>boot-par</artifactId>
    <groupId>com.wy</groupId>
    <version>0.1</version>
</parent>

并且web模块还要依赖service模块

<dependency>
    <groupId>com.wy</groupId>
    <artifactId>boot-service</artifactId>
    <version>0.1</version>
</dependency>

service模块要依赖commons模块,也就是说我们要在service模块的pom中添加commons的依赖。

<dependency>
    <groupId>com.wy</groupId>
    <artifactId>boot-commons</artifactId>
    <version>0.1</version>
</dependency>

在父项目中要确保声明了所有的子模块

<modules>
    <module>boot-commons</module>
    <module>boot-service</module>
    <module>boot-web</module>
</modules>

到此项目结构就准备好了。

第三步:写一套测试代码。首先在commons中写一个工具类,简单的输出一句话。

package com.wy.utils;

/**
 * @创建人 wangyang
 * @创建时间 2022/10/2
 * @描述
 */
public class OutPutUtil {
    
    public static void outMes(){
        System.out.println("commos模块的输出");
    }
    
}

随后在Service模块中写一个测试Service调用commons的工具类

package com.wy;

import com.wy.utils.OutPutUtil;

/**
 * @创建人 wangyang
 * @创建时间 2022/10/2
 * @描述
 */
 @Service
public class OutPutService {

    public void outMes(){
        OutPutUtil.outMes();
        System.out.println("这里是Service");
    }

}

这里注意子模块是可以使用父项目的依赖的,所以不要疑惑service模块没有依赖怎么可以用Service注解。

如果你在写代码的时候commons的模块代码引用不到,就点击一下maven的刷新
在这里插入图片描述

最后在web模块中添加写一个测试用的Controller

package com.example.bootweb.controller;

import com.wy.OutPutService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.annotation.Resource;

/**
 * @创建人 wangyang
 * @创建时间 2022/10/2
 * @描述
 */
@Controller
public class OutController {

    @Resource
    private OutPutService outPutService;

    @RequestMapping("/getMes")
    public String outMes(){
        return "请求成功";
    }
}

并且在web模块的启动类上添加一个扫描包的注解,如果从前面知识点看过来的会疑惑这个例子中没有写Dao层,为什么要写扫描包的注解?对此要解释一下,前面知识点使用的注解是@MapperScan,是MybatisPlus提供的用来指定Dao层包的,但是我们现在要用的注解是@ComponentScan,是springboot提供的用它来指定根包,将不同模块中的Bean提交到Spring容器里面

package com.example.bootweb;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;

@SpringBootApplication
@ComponentScan(basePackages = {"com.wy","com.example"})
public class BootWebApplication {

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

}

在把web模块中的springboot配置文件设置一个端口

server.port=91

到此测试代码就写完了。

第四步:打包,但是我们要对每个模块pom依赖中的编译插件,做一下设置,让maven知道每个模块怎么编译,不设置的话会爆一些默认资源没有的错误。

首先父工程的编译插件不变

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

在web模块中你要手动指定启动类

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <mainClass>com.example.bootweb.BootWebApplication</mainClass>
    </configuration>
</plugin>

而其它非启动模块,如service和commons模块中设置不让springboot-maven编译插件将当前模块作为启动模块编译

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>

此时,运行父项目的maven命令进行打包,等待结束可以在控制台中看到编译成功
在这里插入图片描述
第六步:运行,我们通过web模块的启动类使用内部web软件运行项目,并发出请求。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当然你可以不在idea里面运行,而是在黑窗口中直接运行web项目的jar包


特别说明

模块化开发本质就是maven项目相互依赖,最终用组成一个相对完整的springboot项目运行,就像上面例子一样。模块化开发最应该重要的事情之一就是你每个模块尽量不要产生包的冲突,如service模块和commons模块其实就不是很合理,应该在所有子模块中考虑有一个用来区分不同模块的包名这样逻辑更清晰一些。

你也可以结合知识点17将web模块部署到外部的tomcat上。

本博文末尾要说明一个事,在正式开发中存在着保存当前版本jar到本地maven库的需求,这个就是你运行maven的install命令就可以,可是千万要记得要从最底层依赖开始install,比如上面的例子中你需要按照commons-》Service-》web这样的顺序install,不然会报错

相关文章:

  • 沉睡者IT:零基础学习短视频与+玩转抖音快手
  • 【CSS】伪类选择器有什么用?有哪些是常用的伪类?
  • VirtualBox虚拟机安装教程
  • docker 镜像打包发布
  • MyBatis(详)
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • Linux: 为root账户设置密码
  • 数组常用操作中np.delete用法
  • C++入门-----初始化列表
  • JavaScript—正则
  • 草莓熊python turtle绘图代码
  • 5.3 马氏链-常返和非常返(Durrett)
  • 【已解决】利用 Java 多线程并发编程提高数据处理效率
  • Spring日志引用原理
  • 项目实战 | 基于RK3566开发板实现USB摄像头推流(ffmpeg+nginx)
  • 【Leetcode】101. 对称二叉树
  • 4个实用的微服务测试策略
  • co模块的前端实现
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • ES6语法详解(一)
  • MySQL用户中的%到底包不包括localhost?
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • yii2中session跨域名的问题
  • 从tcpdump抓包看TCP/IP协议
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 给新手的新浪微博 SDK 集成教程【一】
  • 前端_面试
  • 深入浏览器事件循环的本质
  • 使用 QuickBI 搭建酷炫可视化分析
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • ​ssh免密码登录设置及问题总结
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #define、const、typedef的差别
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (3)llvm ir转换过程
  • (6)设计一个TimeMap
  • (poj1.2.1)1970(筛选法模拟)
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二)pulsar安装在独立的docker中,python测试
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (一) springboot详细介绍
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)【Hibernate总结系列】使用举例
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)visual stdio 书签功能介绍
  • (转)创业家杂志:UCWEB天使第一步
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .NET Core 成都线下面基会拉开序幕
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)