为什么会有这个系列文章
- 在项目开发中,大多项目依旧沿用的是 JDK 8 + Spring Boot 2.x 系列的技术栈,没有Spring Boot 3.x 的上手实践机会。
- 在个人学习探索 Spring Boot 3.x 的过程中,遇到多数第三方框架集成和问题排查的技术问题,搜索到都是零碎的、没有直接结果的回答,所以以此系列记录在 Spring Boot 3.x项目探索过程,搭建一个 web 项目的基础脚手架,供其他用到类似技术的同学参考。
技术选型
因为项目目前定义为单体且以简单易上手为主,所以采用的技术栈相对通用、易用,有其他需求的同学可留言,在有能力的情况下会进行集成 Demo.
技术栈 | 版本 |
---|---|
JDK | 21 |
Spring Boot | 3.2.5 |
PostgreSQL | 16 |
MyBatis Plus(ORM 框架) | 3.5.7 |
Redis(外置缓存) | 7 |
Redisson (Redis 高级客户端) | 3.25.0 |
SaToken(轻量鉴权框架) | 1.38.0 |
MapStruct(实体映射工具,非必需) | 1.5.5.Final |
项目初始化
根据个人习惯,用生成器或 IDE 工具初始化项目,或创建 Maven 工程后手动添加依赖。
Spring 官方项目初始化工具 start.spring.io ,阿里云初始化工具 start.aliyun.com,网络环境不佳的同学可选择阿里云工具创建。
Spring 官方初始化工具示例
阿里云初始化工具示例
阿里云应用脚手架对每一项描述较为清晰,不多复述
IDE 工具示例(以 IDEA 为例)
项目结构
不同工具初始化目录结构可能略有差异
├─src
│├─main
│ ├─java
│ │ └─com
│ │ └─bootemp
│ │ └─boot3
│ │ └─Boot3Application.java---- // 项目启动类
│ └─resources
│ └─application.properties--------- // 项目默认配置文件
└─test------------------------------- // 单元测试
└─pom.xml------------------------------ // Maven 工程文件
项目配置
项目结构规划
合适的项目结构有利于项目后期的维护,不同的项目结构适合不同的开发团队和开发习惯,仅个人习惯。
├─.gitignore
├─docs------------------------------ // 项目文档,如SQL、项目部署文档,UML等
├─pom.xml
└─src
└─main
└─java
└─cn
└─yiyanc
├─common------------------ // 项目通用组件(工具类,常量等)
├─config------------------ // 项目配置
├─service------------------ // 业务逻辑处理
├─infrastructur---------- // 项目基础设施,如ORM、缓存服务、消息队列等基础组件
├─MainApplication.java---- // 项目启动类
└─trigger----------------- // 项目入口
├─common
├─http------------------ // http请求
├─job------------------- // 任务
└─listener-------------- // 事件监听
依赖版本配置
不同的项目初始化方式,支持、生成的依赖版本各有不同,在进行项目配置前,先统一版本信息。
编辑 pom.xml
文件
<?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.bootemp</groupId>
<artifactId>boot3</artifactId>
<version>0.0.1</version>
<name>boot3</name>
<packaging>jar</packaging>
<description>从零搭建SpringBoot 3.x项目脚手架</description>
<properties>
<!-- 定义项目基础 -->
<java.version>21</java.version>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- 定义SpringBoot依赖版本 -->
<spring-boot.version>3.2.5</spring-boot.version>
<!-- 定义项目依赖版本 -->
<mybatis-plus.version>3.5.4.1</mybatis-plus.version>
<redisson.version>3.25.0</redisson.version>
<sa-token.version>1.38.0</sa-token.version>
<hutool.version>5.8.25</hutool.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- 以依赖管理的方式管理SpringBoot依赖版本 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 引入项目依赖 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</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>
<!-- 指定构建后的Jar包名 -->
<finalName>app</finalName>
<plugins>
<!-- Maven编译配置 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>21</source>
<target>21</target>
<encoding>UTF-8</encoding>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
<!-- SpringBoot配置 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 指定构建时指定启动文件 -->
<mainClass>com.bootemp.boot3.MainApplication</mainClass>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
项目参数配置
spring boot 默认配置文件为 application.properties
, 个人习惯使用 yml 格式。
配置文件规划:
application.yml
- 系统通用配置文件,用于引导加载不同环境配置application-local.yml
- 本地开发环境配置文件,一般在.gitignore
添加忽略,避免个人使用习惯“污染”项目配置application-dev.yml
- 开发环境配置文件application-prod
- 生产环境配置文件
当前为演示项目,仅配置application.yml
和application-local.yml
文件,项目只进行最简配置,对特定参数如数据库连接池参数有要求等,请自行添加。
如环境配置中存在与
application.yml
相同配置会覆盖配置
application. yml
server:
port: 8080
servlet:
context-path: /boot3
shutdown: graceful
logging:
file:
path: ./logs
level:
com.bootemp: debug
spring:
application:
name: boot3
mvc:
pathmatch:
matching-strategy: ant_path_matcher
main:
banner-mode: off
application-local. yml
spring:
datasource:
# 数据库驱动
driver-class-name: org.postgresql.Driver
# 数据库连接地址
url: jdbc:postgresql://127.0.0.1:5432/boot3
# 数据库用户名
username: postgres
# 数据库密码
password: postgres
测试 Controller
package com.bootemp.boot3.trigger.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/")
public String hello() {
return "Hello, SpringBoot 3.2.5!";
}
}
启动项目,基础配置完成
访问测试接口
最后项目结构
├─logs
├─pom.xml
└─src
├─main
│ ├─java
│ │ └─com
│ │ └─bootemp
│ │ └─boot3
│ │ ├─common
│ │ ├─config
│ │ ├─infrastructur
│ │ ├─MainApplication.java
│ │ ├─service
│ │ └─trigger
│ │ ├─controller
│ │ │ └─HelloController.java
│ │ ├─job
│ │ └─listener
│ └─resources
│ ├─application-local.yml
│ └─application.yml
└─test