记录下spring boot 多模块项目的设置过程;首先简单说下为啥需要多模块,一个模块分目录行不行,当然可以,但是这样会导致多个团队开发的时候混乱,会有很多冲突;如果根据领域设计将项目按照不同的领域进行划分,后续维护起来会方便很多;对于以后如果进行微服务的拆分也是很方便的,直接将对应的模块迁移成一个单独的服务即可;还有针对业务初期,可以考虑一个大的项目,不同的功能,比如商城,下单,支付分别建立不同的模块,后期如果业务发展迅速,直接拆分成对应的模块为微服务项目即可;
接下来会用一个简单的项目演示,将springboot的web层,service层,dao层拆分成不同的模块;通过一个简单的crud来测试下;
项目目录结构
1.首先最外层是pom.xml;最外层的pom,作为项目的root 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> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.4</version> </parent> <groupId>com.example</groupId> <artifactId>demo-multiple</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <properties> <java.version>1.8</java.version> <project.version>0.0.1-SNAPSHOT</project.version> </properties> <modules> <module>web</module> <module>service</module> <module>dao</module> </modules> <dependencyManagement> <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>demo-service</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.example</groupId> <artifactId>demo-web</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.example</groupId> <artifactId>demo-dao</artifactId> <version>${project.version}</version> </dependency> </dependencies> </dependencyManagement> </project>
我们一般定义整个项目的依赖,比如spring-boot-starter-parent;这里同时指定了整个项目有三个模块,分别是web,service,dao;
同时在dependencyManagement中设置了项目的依赖的版本管理;也就是下面的子模块以来的版本不需要指定版本了,比如web依赖了service这个模块,不需要设置版本,版本统一在这里进行管理;
2.web 模块
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> <groupId>com.example</groupId> <artifactId>demo-multiple</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <groupId>com.example</groupId> <artifactId>demo-web</artifactId> <version>${project.version}</version> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.example</groupId> <artifactId>demo-service</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
每个子模块会设置parent的信息,同时自己的版本也从根pom中变量获取,同时以来的demo-servce我们看到是没有设置版本的;
web中的项目启动类如下
同时,我们在web中写了一个controller,请求如下
这个地方的TestService是demo-service这个module中的;
同时资源文件设置了数据库的连接信息
data.txt是数据库的初始化脚本,这里我们用的h2的数据库
3.service模块
pom中以来了dao模块
同时我们简单写一个查询方法,这个查询方法以来与dao模块
4.dao模块
dao模块对数据库进行操作,我们使用jpa,依赖如下所示
同时写一个简单的查询
对应的数据库实体如下所示
之后我们运行项目,启动之后,访问这个地址
http://localhost:8086/test1
会将数据库的用户信息打印出来,结果如下
[XwjUser{id=11, name='张三', age=12, createDate=2020-04-17 00:00:00.0}, XwjUser{id=12, name='李四', age=13, createDate=2020-04-17 00:00:00.0}, XwjUser{id=13, name='王五', age=25, createDate=2020-04-17 00:00:00.0}, XwjUser{id=14, name='赵六', age=17, createDate=2020-04-17 00:00:00.0}, XwjUser{id=15, name='吉米', age=30, createDate=2020-04-17 00:00:00.0}]
总结:在跟pom中定义springboot-start作为整个项目的parent,然后配置整个项目的module信息;
同时在dependence-manage定义依赖版本管理,这样子项目中不用指定版本,只引入依赖;好处是多个子项目共同依赖版本发生变化时,只修改跟pom中设置的版本变量即可;同时各个子模块的package最好相同,这样在启动类中,设置一个扫描即可;
@SpringBootApplication(scanBasePackages = {"com.example.multiple"})
整个项目的资源文件放在web目录下;