创建多模块Spring项目

3.4k words

Step 1 -> 初始化项目,配置远程git仓库

1. 创建远程git仓库

2. 创建本地Maven项目(父工程) & 创建本地git仓库

3. 检查Maven配置

alt

4. 配置并推送到远程仓库

alt

Step 2 -> 多模块化

父工程/父模块

  1. 删除父模块多余文件
    保留 pom.xml用于依赖管理

  2. 配置pom.xml

  • properties统一声明版本号、其他公共配置属性,例如:统一配置项目构建的源码的字符集格式

  • DepencyManagement统一声明依赖
    相当于一个对所依赖jar包进行版本管理的管理器
    只是声明依赖,并不实现引入

  • dependencyManagementdependencies

    • 使用dependencyManagement
      子项目需要显式的声明需要用的依赖
      只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项
      指定版本号时,会使用子项目中指定的jar版本。

    • 使用dependencies
      即使在子项目中不写该依赖项,子项目仍然会从父项目中继承该依赖项(全部继承)

在DepencyManagement中声明子模块的<dependency>,方便子模块间相互引用

  • <type>pom</type>&<scope>import</scope>

    1
    2
    <type>pom</type>
    <scope>import</scope>

    当一个父pom中的dependencyManagement标签中需要导入另一个pom中的dependencyManagement的时候
    必须同时使用<scope>import</scope><type>pom</type>

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>2021.0.4</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>
    </dependencies>
    </dependencyManagement>

    当需要把一些依赖定义到一个pom工程中,但是由于maven单继承机制,子工程又想通过依赖引入该pom工程中的所有依赖
    只需要添加<type>pom</type>

    type默认为jar,依赖jar工程时无需type标签
    并且依赖jar,则会将jar工程中包含的大量依赖传递过来

子模块划分

模块划分无标准,下面是一些思路以及例子
按业务,技术拆分,按分层划分
拆分公共模块
拆分后的子模块应该具有独立的功能和职责,能够单独进行测试、构建和部署。

例1:

project-name-admin
项目的后台模块 提供后台服务controller
程序入口 - Application
程序配置 - properties.yml

project-name-common
项目的公共模块
实体类entity,工具类utils,常量constant,配置config,响应response,异常exception
枚举enums,注解annotation

project-name-system
项目的系统模块
用户管理,系统设置等
service,mapper

project-name-core
项目的核心业务,service,mapper

project-name-xxx
项目的其他模块

例2

DDD框架

  • project-name
    • project-name-main
      • project-name-app
      • project-name-client
      • project-name-domain
      • project-name-entry
      • project-name-infra
    • project-name-starter

模块打包

在多模块项目中,通常还会有聚合模块父模块。聚合模块用于将多个子模块组织在一起,方便进行统一的构建和测试;而父模块用于管理所有子模块的依赖关系、插件配置等信息。这两个模块都不需要打包成 jar 文件,它们只是用于组织并管理子模块的结构和配置信息。
聚合模块和父模块pom打包

对于一个多模块项目,只有子模块需要打包成 jar 文件并发布到 Maven 仓库中,而聚合模块和父模块则不需要打包成 jar 文件
子模块jar打包

Step 3 -> yml环境配置(数据库连接,mybatis等等),多环境

1.配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 应用服务 WEB 访问端口
server:
port: 6001

# 数据库配置
spring:
# 数据源配置
datasource:
url: jdbc:mysql://127.0.0.1:3306/tool_pack?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver

# mybatis配置
mybatis:
#指定Mybatis的Mapper文件
mapper-locations: classpath:mappers/*xml
#指定Mybatis的实体目录
type-aliases-package: com.hikaristar.toolPack.entity

2.多环境

application-dev.yml 开发环境 - 一般打开全部错误报告
application-test.yml 测试环境
application-prod.yml 生产环境 - 正式提供对外服务,一般会关掉错误报告,打开错误日志

application.yml
激活某一环境

1
2
3
spring:
profiles:
active: dev

分层

各层对象定义一例
controller request入参,dto出参
service request入参,dto出参
dao param入参,do出参

注意事项

  • 业务逻辑层Service和数据库DAO层的操作对象不要混用
  • Controller层的数据对象不要直接渗透到DAO层(或者mapper层)
  • 同理数据表实体对象Entity也不要直接传到Controller层进行输出或展示

导入依赖

Spring

  • Spring Web
    Spring核心依赖,相关注解支持

访问数据库

  • JDBC API
    Java程序访问数据库的标准接口

  • MySQL Driver
    用于访问Mysql数据库的官方驱动

  • MyBatis Framework
    用于数据库连接/操作的持久层框架

工具

  • Lombok
    注解生成get/set等

  • Mapstruct
    对象间的属性拷贝

  • Mapstruct-processor
    MapStruct的编译时注解处理器,它可以在编译时自动生成映射代码


中间件

  • spring-boot-starter-amqp
    基于AMQP协议的消息中间件框架,消息队列,RabbitMQ

补充

application.properties文件乱码

alt

Spring多模块扫描

默认扫描启动类同级包和子包内容

多模块时,依赖的模块,同包合并扫描
alt

Application位于com.hikaristar包下,tool-pack-admin依赖tool-pack-db
tool-pack-db的com.hikaristar包下被扫描

参考

SpringBoot多模块项目开发(Maven多模块项目)
Maven中<scope>import</scope> <type>pom</type>用法