知识点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,不然会报错