SpringBoot项目模块化开发
标题为什么要进行模块化开发?
永远记住:技术是为业务服务的。
模块化开发是为了更好的管理项目,管理代码。常见于大型项目,把不同的模块分离开,方便开发和管理。其本质上其实还是一个项目(非微服务的分布式),只不过是划分了模块,使其类似于分布式:多个项目组合在一起。
如何构建一个模块化的Springboot项目?
父项目
首先,创建一个项目,maven或者springboot项目,都一样。
然后,清空项目下的项目文件,只留下pom文件即可。如下:(我的项目有别的模块,target是跑过就生成的)
pom里面设置如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.fang.study</groupId>
<artifactId>lifetime-study</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.13</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<modules>
<!-- 这里是你的功能模块-->
<!-- <module>common</module>-->
<!-- <module>dao</module>-->
<!-- <module>sever</module>-->
<!-- <module>web01</module>-->
<!-- <module>web02</module>-->
<!-- <module>entrance</module>-->
<module>dynamic-datasource01</module>
<module>dynamic-datasource02-rwseparation</module>
<module>thread_threadPool</module>
</modules>
<properties>
<java.version>1.8</java.version>
</properties>
<!-- 定义所有子项目都会用到的包 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- <build>-->
<!-- <plugins>-->
<!-- <plugin>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-maven-plugin</artifactId>-->
<!-- </plugin>-->
<!-- </plugins>-->
<!-- </build>-->
</project>
然后就是子项目了
在父项目上右键新建Module,这样夫项目的<modules></modules>
标签会自动加入子项目
项目结构:
是的,没有启动类,你没看错
pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 父项目引入 -->
<parent>
<artifactId>lifetime-study</artifactId>
<groupId>com.fang.study</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.fang.modules</groupId>
<artifactId>dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dao</name>
<description>modules-dao</description>
<dependencies>
<!-- <dependency>-->
<!-- <groupId>org.mybatis.spring.boot</groupId>-->
<!-- <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!-- <version>3.0.0</version>-->
<!-- </dependency>-->
</dependencies>
</project>
所有的子项目模块目录结构都一样,pom文件对应的更改。
注意,子项目的包建议是一样的,我的是com.fang.modules
,方便后面使用
如何使用
比方说,我子项目有一个叫web的,这个是所有接口的入口,所有的controller都在这个项目里面。
那么,controller是调用service的,我们需要在对应的pom文件里面引用service,如下:
<dependencies>
<dependency>
<groupId>com.fang.modules</groupId>
<artifactId>sever</artifactId>
<version>${project.parent.version}</version>
</dependency>
</dependencies>
如何测试使用?
我们注意到,所有的项目中都没有启动类,我的项目额外新建了一个子项目,作为启动项目,构建如其他子项目一样,但是有启动类
pom文件:一样
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>lifetime-study</artifactId>
<groupId>com.fang.study</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.fang.modules</groupId>
<artifactId>entrance</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>entrance</name>
<description>modules-entrance</description>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.fang.modules</groupId>
<artifactId>web01</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>com.fang.modules</groupId>
<artifactId>web02</artifactId>
<version>${project.parent.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
dependencies
需要引入web子项目,否则我们无法请求到接口
启动类也需要添加包扫描,否则一样无法请求到接口(原因是springboot没有扫描到你的controller,IOC容器便不存在接口,就报错了)
package com.fang.modules.entrance;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan(value = {"com.fang.modules"})//多个可以写数组
public class EntranceApplication {
public static void main(String[] args) {
SpringApplication.run(EntranceApplication.class, args);
}
}
到这里基本就完成构建了,自己写一点业务逻辑测试一下是否成功。
排坑:如果说有抽离一下底层的实体类作为公共包引入,可能有时候需要install一下
如何打包
打包要求所有需要打包的项目要有打包的插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
然后在入口文件配置启动类
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.fang.modules.entrance.EntranceApplication</mainClass>
</configuration>
</plugin>
</plugins>
</build>
其他没有启动类的子项目也要配置:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
打包
顺序:
- 父项目先install一下,
- 从底层往上打包:如果有抽离的公共包,先打公共包,install
- dao层打包,install
- service打包,install
- web打包,install
- 入口文件:install,(package应该也行),最后找到.jar文件
- 测试即可
到此结束。