SpringBoot3基础用法
技术和工具「!喜新厌旧」
一、背景
最近在一个轻量级的服务中,尝试了最新的技术和工具选型;
即SpringBoot3,JDK17,IDEA2023,Navicat16,虽然新的技术和工具都更加强大和高效,但是适应采坑的过程总是枯燥的;
【环境一览】

首先框架主体从SpringBoot2升级到SpringBoot3,Java基础环境从JDK8升级到JDK17;
技术升级都到这步了,自然连带着工具都升级到最新版本了,涉及到的其他组件,也会选择与当前框架适应的版本;
至于为何使用JDK17,因为是SpringBoot3的最低依赖,也和官方的维护周期有关;

实际上如果JDK21已经发布的话,个人更倾于这个版本,要是没有合适的尝试机会,继续使用JDK8也问题不大;
另外开发工具IDEA2021.2版本才开始支持JDK17,所以如果版本过低的话也需要升级,至于Navicat16纯属跟风操作;
二、环境搭建
1、工程结构
在工程结构上没有什么变化,通过maven组件构建项目,对于入门案例来说,注意框架依赖,启动类,配置文件即可;

2、框架依赖
在该工程中只是SpringBoot3框架的简单测试,所以只引入web依赖就足够;
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
</dependencies>
至于Spring框架和其他组件的依赖,顺着web依赖追溯即可,核心的依赖和版本都可以找到;

3、环境配置
入门案例,在这里只简单的配置服务器和应用名称;
server:
port: 8082 # 端口号
tomcat: # Tomcat组件
uri-encoding: UTF-8 # URI编码
spring:
application:
name: boot-base
三、入门案例
1、测试接口
提供一个简单的Get请求接口,使用了部分JDK新版的语法,如果抛出异常会统一处理;
@RestController
public class BootBaseWeb {
@GetMapping("/boot/base/{id}")
public Map<String,String> getInfo (@PathVariable String id){
if (id.isBlank() || "0".equals(id)){
throw new RuntimeException("参数ID错误");
}
var dataMap = new HashMap<String,String>();
dataMap.put("id",id);
dataMap.put("boot","base");
return dataMap ;
}
}
2、全局异常
基于注解RestControllerAdvice和ExceptionHandler统一异常处理;
@RestControllerAdvice
public class HandlerExe {
@ExceptionHandler(value = Exception.class)
public Map<String,String> handler02 (HttpServletRequest request, Exception e){
var errorMap = new HashMap<String,String>() ;
errorMap.put("code","500");
errorMap.put("url",request.getRequestURL().toString());
errorMap.put("msg",e.getMessage());
return errorMap ;
}
}
3、日志打印
3.1 日志配置
在application.yml文件中,简单的添加日志配置内容,然后从日志文件或者控制台输出查看相关信息;
logging:
level:
root: info
file:
path: ./
name: logs/${spring.application.name}.log
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} %contextName [%thread] %-5level %logger- %msg%n"
file: "%d{yyyy-MM-dd HH:mm:ss} %contextName [%thread] %-5level %logger- %msg%n"
logback:
rolling-policy:
max-history: 7
max-file-size: 10MB
total-size-cap: 50MB
3.2 日志打印
虽然采用的是logback组件,但是使用slf4j的API即可;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@RestController
public class BootLogWeb {
private static final Logger LOGGER = LoggerFactory.getLogger(BootBaseWeb.class);
@GetMapping("/boot/print/log")
public String printLog (HttpServletRequest request){
LOGGER.info("remote-host:{}",request.getRemoteHost());
LOGGER.info("request-uri:{}",request.getRequestURI());
return request.getServerName() ;
}
}
四、打包运行
打包代码工程中的m1-01-boot-base子模块,以及其相关的依赖;
mvn clean -pl m1-01-boot-base -am -Dmaven.test.skip=true package
运行m1-01-boot-base.jar服务,并指定相应的端口号为8080,然后测试其中相关接口查看日志即可;
java -jar m1-01-boot-base.jar --server.port=8080
五、参考源码
文档仓库:
https://gitee.com/cicadasmile/butte-java-note
源码仓库:
https://gitee.com/cicadasmile/butte-spring-parent
SpringBoot3基础用法的更多相关文章
- PropertyGrid控件由浅入深(二):基础用法
目录 PropertyGrid控件由浅入深(一):文章大纲 PropertyGrid控件由浅入深(二):基础用法 控件的外观构成 控件的外观构成如下图所示: PropertyGrid控件包含以下几个要 ...
- logstash安装与基础用法
若是搭建elk,建议先安装好elasticsearch 来自官网,版本为2.3 wget -c https://download.elastic.co/logstash/logstash/packag ...
- elasticsearch安装与基础用法
来自官网,版本为2.3 注意elasticsearch依赖jdk,2.3依赖jdk7 下载rpm包并安装 wget -c https://download.elastic.co/elasticsear ...
- BigDecimal最基础用法
BigDecimal最基础用法 用字符串生成的BigDecimal是不会丢精度的. 简单除法. public class DemoBigDecimal { public static void mai ...
- Vue组件基础用法
前面的话 组件(Component)是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.根据项目需求,抽象出一些组件,每个组件里包含了展现.功能和样式.每个页面,根据自己所需, ...
- Smarty基础用法
一.Smarty基础用法: 1.基础用法如下 include './smarty/Smarty.class.php';//引入smarty类 $smarty = new Smarty();//实例化s ...
- 前端自动化测试神器-Katalon的基础用法
前言 最近由于在工作中需要通过Web端的功能进行一次大批量的操作,数据量大概在5000左右,如果手动处理, 完成一条数据的操作用时在20秒左右的话,大概需要4-5个人/天的工作量(假设一天8小时的工作 ...
- Bootstrap fileinput:文件上传插件的基础用法
官网地址:http://plugins.krajee.com/ 官网提供的样例:http://plugins.krajee.com/file-input/demo 基础用法一 导入核心CSS及JS文件 ...
- asyncio 基础用法
asyncio 基础用法 python也是在python 3.4中引入了协程的概念.也通过这次整理更加深刻理解这个模块的使用 asyncio 是干什么的? asyncio是Python 3.4版本引入 ...
- oracle入坑日记<六>自增列创建和清除(含序列和触发器的基础用法)
0 前言 用过 SQLserver 和 MySQL 的自增列(auto_increment),然而 Oracle 在建表设置列时却没有自增列. 查阅资料后发现 Oracle 的自增列需要手动编写. ...
随机推荐
- Unity快速接入bugly, 支持Unity2021
鹅厂提供的bugly官方demo工程打包后台也查不到日志,N年不更新(官方已经说不再维护),为此本人做了部分修改测试,提供一个快速接入工程的demo. Unity2021因为版本原因腾讯官方工程不能使 ...
- 2021-05-25:给定一个矩阵matrix,值有正、负、
2021-05-25:给定一个矩阵matrix,值有正.负.0,蛇可以空降到最左列的任何一个位置,初始增长值是0,蛇每一步可以选择右上.右.右下三个方向的任何一个前进,沿途的数字累加起来,作为增长值: ...
- 2021-08-25:给定数组father大小为N,表示一共有N个节点,father[i] = j 表示点i的父亲是点j, father表示的树一定是一棵树而不是森林,queries是二维数组,大小为
2021-08-25:给定数组father大小为N,表示一共有N个节点,father[i] = j 表示点i的父亲是点j, father表示的树一定是一棵树而不是森林,queries是二维数组,大小为 ...
- WPF入门教程系列二十四——DataGrid使用示例(1)
WPF入门教程系列二--Application介绍 WPF入门教程系列三--Application介绍(续) WPF入门教程系列四--Dispatcher介绍 WPF入门教程系列五--Window 介 ...
- Apache Arrow DataFusion原理与架构
本篇主要介绍了一种使用Rust语言编写的查询引擎--DataFusion,其使用了基于Arrow格式的内存模型,结合Rust语言本身的优势,达成了非常优秀的性能指标 DataFusion是一个查询引擎 ...
- 解决:django.db.utils.OperationalError: no such table: auth_user
解决:django.db.utils.OperationalError: no such table: auth_user 我们在创建Django项目的时候已经创建这个表了,表一般都保存在轻量级数据库 ...
- Vue 打包后报 Uncaught SyntaxError: Unexpected token ‘<‘
根本原因在于你的vue.config.js里的publishPath设置的路径是相对路径还是绝对路径 大家都是看别人设置成 process.env.NODE_ENV==='production' ? ...
- AcWing 1024. 装箱问题
有一个箱子容量为 V,同时有 n 个物品,每个物品有一个体积(正整数). 要求 n 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小. 输入格式 第一行是一个整数 V,表示箱子容量. 第二行是一个 ...
- weex 开发APP 多行文本溢出处理
weex中文字溢出不能使用常规的overflow:hidden 如: .text { overflow: hidden; text-overflow: ellipsis; white-space: n ...
- Java(类与对象、封装)
面向过程.面向对象 面向对象编程(Object-Oriented Programming, OOP) 本质:以类的方式组织代码,以对象的组织(封装)数据. 抽象 三大特性 封装 继承 多态 从认识论的 ...