springboot分模块开发

为什么需要分模块

先介绍下背景,项目为什么需要用多模块?springmvc难道还不够?

(1)设计模式真言:“高内聚、低耦合”,springmvc项目,一般会把项目分成多个包:controller、service、dao、util等,但是随着项目的复杂性提高,想复用其他一个模块的话,因为是包的形式,剥离出来会比较困难,耦合性有点强,常用的方法就是复制代码修改,但是这样会做很多无用功与增加出错几率。

(2)springboot多模块简单来说,就是把按包分模块的模式,借助maven升级到jar的方式,抽象性更加强了,假如jar再升级到到war或者多个集合jar,就成微服务了( springcloud入门系列),在多模块jar模式下可以将某个jar拿出来对外共用,能大大提高代码复用率与开发效率。

案例

最近写了一个工具箱的项目(未完成),一开始并没有采用多模块的方式,写了一部分代码之后,发现代码结构比较乱,因为是工具箱肯定有许多工具,比如 备忘录工具,邮箱工具,等等。这些代码基本没有互相关联的地方,故打算将他们独立起来。

思路

(1)新建springboot项目;

(2)在新建后的springboot项目中新建多个module;

(3)修改pom文件以及删除多余的文件及文件夹。

解决方案

创建pom父工程

新建一个maven项目,删除pom文件外的所有文件,然后编辑pom文件。大致如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.ss.project</groupId>
<artifactId>tool-center</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<!-- 刚创建时是没有这个东西,后续创建modules时会自动加上-->
<modules>
<module>main</module>
<module>auth</module>
<module>common</module>
<module>memo</module>
</modules>
<name>夏十七工具箱</name>
<description>夏十七工具箱后台</description>

<!--由于我们是新建SpringBoot项目 所以继承spring-boot-starter-parent -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
</parent>

<!-- 原则上需要将所有依赖的版本在这边定义,方便后续添加、修改 -->
<properties>
<java.version>1.8</java.version>
<druid.version>1.1.22</druid.version>
<hutool.version>5.1.0</hutool.version>
<mysql.version>8.0.11</mysql.version>
<jjwt.version>0.11.1</jjwt.version>
<mybatis.version>3.3.2</mybatis.version>
<dynamic.version>3.2.0</dynamic.version>
<xia17common.version>0.0.1-SNAPSHOT</xia17common.version>
<tool-center.version>1.0-SNAPSHOT</tool-center.version>
</properties>

<dependencies>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

<!-- 夏十七通用包 -->
<dependency>
<groupId>com.ss.plugins</groupId>
<artifactId>common</artifactId>
<version>${xia17common.version}</version>
</dependency>

<!-- spring-data-jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!-- 多数据源 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${dynamic.version}</version>
</dependency>


</dependencies>

<!-- 打包方式 -->
<build>
<plugins>
<!-- 打包时跳过测试 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>

</project>

创建子项目

image-20210205155857705

main模块

springboot启动类所在的模块,一些配置文件都可以放在这个模块下,比如 WebMvcConfigurationSupport , RedisConfig

image-20210205160524992

pom文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>tool-center</artifactId>
<groupId>com.ss.project</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<groupId>com.ss.project.tool-center</groupId>
<artifactId>main</artifactId>

<dependencies>

<!-- 依赖备忘录模块 -->
<dependency>
<groupId>com.ss.project.tool-center</groupId>
<artifactId>memo</artifactId>
<version>${tool-center.version}</version>
<scope>compile</scope>
</dependency>


<!-- springboot-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- 排除Tomcat -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>

<!-- springboot-test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>

<!-- 使用undertow服务器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

<!-- druid数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>

<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>

<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>


</dependencies>


</project>

common模块

image-20210205160935804

该模块是一些都要使用的东西,比如我有一个配置MyGolbalProperties 在其他的模块中都要使用吗,就可以放在这里,utils工具类也可以放这里。

pom文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>tool-center</artifactId>
<groupId>com.ss.project</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<groupId>com.ss.project.tool-center</groupId>
<artifactId>common</artifactId>

</project>

auth模块

该模块下面是登录授权相关的代码,这个项目使用的是security ,所以这里面都是security 相关的代码,以及获取用户信息等代码。

image-20210205161035394

pom文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>tool-center</artifactId>
<groupId>com.ss.project</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<groupId>com.ss.project.tool-center</groupId>
<artifactId>auth</artifactId>

<dependencies>
<!-- jwt -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>${jjwt.version}</version>
</dependency>

<!-- security 安全框架 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

<!-- oauth2客户端-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>

<!-- security 安全框架 测试包 -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.ss.project.tool-center</groupId>
<artifactId>common</artifactId>
<version>${tool-center.version}</version>
<scope>compile</scope>
</dependency>

</dependencies>


</project>

memo模块

该模块就是正经的业务模块了,备忘录业务相关的代码都放在这里。

image-20210205161328451

pom文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>tool-center</artifactId>
<groupId>com.ss.project</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<groupId>com.ss.project.tool-center</groupId>
<artifactId>memo</artifactId>

<dependencies>

<!-- 引入auth 模块 -->

<dependency>
<groupId>com.ss.project.tool-center</groupId>
<artifactId>auth</artifactId>
<version>${tool-center.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>

</project>

到此结束

完整结构图如下

image-20210205161535404