【从零搭建SpringBoot3.x 项目脚手架】- 1. 工程初始化

为什么会有这个系列文章

  1. 在项目开发中,大多项目依旧沿用的是 JDK 8 + Spring Boot 2.x 系列的技术栈,没有Spring Boot 3.x 的上手实践机会。
  2. 在个人学习探索 Spring Boot 3.x 的过程中,遇到多数第三方框架集成和问题排查的技术问题,搜索到都是零碎的、没有直接结果的回答,所以以此系列记录在 Spring Boot 3.x项目探索过程,搭建一个 web 项目的基础脚手架,供其他用到类似技术的同学参考。

技术选型

因为项目目前定义为单体且以简单易上手为主,所以采用的技术栈相对通用、易用,有其他需求的同学可留言,在有能力的情况下会进行集成 Demo.

技术栈版本
JDK21
Spring Boot3.2.5
PostgreSQL16
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.ymlapplication-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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/391225.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[极客大挑战 2019]Secret File-web

打开题目 查看源码 直接访问Archive_room.php 第二个页面是个点击框&#xff0c;这里bp抓包确认&#xff1b;若是直接SECRET&#xff0c;会跳到end.php 直接访问secr3t.php 代码审计一下 playload&#xff1a;secr3t.php?fileflag.php 改为php协议读取权限 secr3t.php?f…

[图解]SysML建模电磁轨道炮-01块定义图

1 00:00:00,490 --> 00:00:04,000 我们是用EA复刻一个网络上的案例 2 00:00:06,370 --> 00:00:09,240 电磁轨道炮&#xff0c;它的原理很简单 3 00:00:09,490 --> 00:00:10,960 初中物理就可以理解 4 00:00:11,670 --> 00:00:14,010 首先&#xff0c;电流形成磁…

polyfit曲线拟合

一、简介 polyfit函数是matlab中用于进行曲线拟合的一个函数。其数学基础是最小二乘法曲线拟合原理。曲线拟合&#xff1a;已知离散点上的数据集&#xff0c;即已知在点集上的函数值&#xff0c;构造一个解析函数&#xff08;其图形为一曲线&#xff09;使在原离散点上尽可能接…

快讯 | 苹果携手OpenAI,ChatGPT即将登陆iOS 18

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

【反序列化漏洞】serial靶机详解

一、安装靶机 首先创建新的虚拟机。 然后选择客户机版本为Ubuntu 64位。 然后选择使用现有磁盘&#xff0c;选择下载的vmdk磁盘文件即可。剩下的都是默认 二、信息收集 发现主机192.168.204.143 访问 扫描端口nmap -A 192.168.204.143 -p-&#xff0c;发现只有ssh:22和http:8…

Java:线程安全

引子 首先来看一段代码: private static int count 0;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(()->{for (int i 0; i < 50000; i) {count;}});Thread t2 new Thread(()->{for (int i 0; i < 50000; i) {…

如何解决C#字典的线程安全问题

前言 我们在上位机软件开发过程中经常需要使用字典这个数据结构&#xff0c;并且经常会在多线程环境中使用字典&#xff0c;如果使用常规的Dictionary就会出现各种异常&#xff0c;本文就是详细介绍如何在多线程环境中使用字典来解决线程安全问题。 1、非线程安全举例 Dictio…

Vue+live2d实现虚拟人物互动(一次体验叙述)

目录 故事的开头&#xff1a; 最终的实现效果&#xff1a; 实现步骤&#xff1a; 第一步&#xff1a;下载重要文件 第二步&#xff1a;创建vue项目文件&#xff0c;将刚下载文件拷贝到public目录下 第三步&#xff1a;在index.html文件中引入js 第四步&#xff1a;使用&…

【数据结构算法经典题目刨析(c语言)】顺序表和链表的区别(图文详解)

&#x1f493; 博客主页&#xff1a;C-SDN花园GGbond ⏩ 文章专栏&#xff1a;数据结构经典题目刨析(c语言) 目录 顺序表和链表的区别 一、底层存储空间 二、插入和删除操作 三、随机访问 四、空间利用率 五、应用场景 六、高速缓存 为什么顺序表的缓存利用率高于链表呢…

设计界的新宠:5款热门UI在线设计软件评测

随着用户界面设计行业的蓬勃发展&#xff0c;越来越多的设计师进入用户界面设计。选择一个方便的用户界面设计工具尤为重要&#xff01;除了传统的用户界面设计工具&#xff0c;在线用户界面设计工具也受到越来越多设计师的青睐。这种不受时间、地点、计算机配置限制的工作方法…

OpenCV||超详细的图像边缘检测

一、基本概念 1.图像边缘检测目的 特征提取&#xff1a;边缘是图像中亮度变化最显著的部分&#xff0c;它们通常对应于物体的轮廓、不同区域的边界等。通过边缘检测&#xff0c;可以从图像中提取出这些重要的特征信息&#xff0c;为后续处理如图像分割、目标识别等提供基础。 …

webfunny埋点系统如何进行部署?

hello 大家webfunny埋点系统做了不少功能更新&#xff0c;平常给大家分享比较多的是**webfunny前端监控系统**&#xff0c;最近有不少技术同学来了解webfunny埋点系统&#xff0c;今天主要给大家分享下webfunny埋点系统部署&#xff0c;分为本地部署和线上部署。 还没有试用和…

字节一面面经

1.redis了解吗&#xff0c;是解决什么问题的&#xff0c;redis的应用&#xff1f; Redis 是一种基于内存的数据库&#xff0c;常用的数据结构有string、hash、list、set、zset这五种&#xff0c;对数据的读写操作都是在内存中完成。因此读写速度非常快&#xff0c;常用于缓存&…

第三期书生大模型实战营之XTuner微调个人小助手认知

基础任务 使用 XTuner 微调 InternLM2-Chat-1.8B 实现自己的小助手认知&#xff0c;记录复现过程并截图。 任务结果截图 1. 创建虚拟环境 # 安装一些必要的库 conda install pytorch2.1.2 torchvision0.16.2 torchaudio2.1.2 pytorch-cuda12.1 -c pytorch -c nvidia -y # 安…

2024华数杯数学建模竞赛选题建议+初步分析

提示&#xff1a;DS C君认为的难度&#xff1a;C<A<B&#xff0c;开放度&#xff1a;A<B<C。 综合评价来看 A题适合对机械臂和机器人运动学感兴趣的同学&#xff0c;尤其是有一定编程和优化算法基础的同学。不建议非相关专业同学选择。 B题挑战较大&#xff0…

Go语言实现多协程文件下载器

文章目录 前言流程图主函数下载文件初始化分片下载worker分发下载任务获取下载文件的大小下载文件分片错误重试项目演示最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;最近在开发文件传输相关的项目&#xff0c;然后顺手写了一个多协程文件下载器&#xff0c;代码非常精…

用于遥感数据处理的python脚本

编辑&#xff1a;我不爱机器学习 今天给大家分享一组用于遥感处理的 python 脚本。 作者使用基于无人机的智利中南部泥炭地的高光谱图像。该图像有 41 个波段&#xff08;10 nm 宽&#xff09;&#xff0c;范围为 480-880 nm&#xff0c;像素大小为 10 cm。绿点对应于测量生物…

【Python系列】Python 协程:并发编程的新篇章

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

万物分割(Segment Anything Model)C++模型推理部署

概述 SAM 是一种先进的人工智能模型&#xff0c;已经证明了在分割复杂和多样化图像方面具有优异的表现。该模型是计算机视觉和图像分割领域的一个重大突破。 SAM 的架构旨在处理各种图像分割任务&#xff0c;包括对象检测、实例分割和全景分割。这意味着该模型可以应用于各种用…

CTF-web 基础 网络协议

网络协议 OSI七层参考模型&#xff1a;一个标准的参考模型 物理层 网线&#xff0c;网线接口等。 数据链路层 可以处理物理层传入的信息。 网络层 比如IP地址 传输层 控制传输的内容的传输&#xff0c;在传输的过程中将要传输的信息分块传输完成之后再进行合并。 应用…