环境:Spring Boot 3.5
Spring Boot3.5 更新的内容许多,接下来我将介绍11个比较不错的功能吧!
1. 严格的'.enabled'配置属性
对 .enabled 属性的支持值进行了严格限制,目前更加一致。值目前必须是 true 或 false。之前的 Spring Boot 版本有时会使用这样的条件:将任何非 false 的值都视为启用。
2. 自动配置的 TaskExecutor 名称
之前,Spring Boot 会自动配置一个名为 taskExecutor 和 applicationTaskExecutor 的 TaskExecutor。从本次发布开始,只提供 applicationTaskExecutor 这个 bean 名称。应该调整按名称请求自动配置的 Executor 的代码,以使用 applicationTaskExecutor。
如果你依赖这种行为且无法立即更改,可以使用 BeanFactoryPostProcessor 添加别名,如下例所示:
@Configuration
public class AppConfig {
@Bean
static BeanFactoryPostProcessor taskExecutorAlias() {
return (beanFactory) -> beanFactory.registerAlias(
"applicationTaskExecutor", "taskExecutor");
}
}
3. Redis配置
当配置了 spring.data.redis.url 时,使用的 Redis 数据库由 URL 决定。如果 URL 未指定数据库,则默认使用 0。当配置了 spring.data.redis.url 时,
spring.data.redis.database 属性目前将被忽略,以使其行为与主机、端口、用户名和密码属性保持一致。如下配置:
spring:
data:
redis:
url: redis://user:password@pack.com:6379/8
# 下面的配置将被忽略;database使用上面的8
database: 2
4. 基于注解注册Filter和Servlet
作为 ServletRegistrationBean 和 FilterRegistrationBean 的基于注解的替代方案,添加了两个新注解。@ServletRegistration 可用于注册 Servlet,而 @FilterRegistration 可用于注册 Filter,如下例所示:
@Bean
@FilterRegistration(name = "my-filter", urlPatterns = "/api/*", order = 0)
MyFilter myFilter() {
return new MyFilter() ;
}
5. 从环境变量加载属性
虽然之前已经可以从环境变量加载单个属性,但目前可以从单个环境变量加载多个属性。如下示例:
配置多行环境变量:
PS C:UsersAdministrator> $appsetting = @"
>> pack.title=Pack
>> pack.version=1.0.0
>> "@
PS C:UsersAdministrator> [System.Environment]::SetEnvironmentVariable("APP_PACK", $appsetting, "User")
注:这里必须使用PowerShell运行命令。
在配置文件application.yml中导入:
spring:
config:
import:
# 注意格式,使用env: 前缀
- "env:APP_PACK"
测试代码
@Component
public class EnvProperties implements CommandLineRunner {
@Value("${pack.title}")
private String title ;
@Value("${pack.version}")
private String version ;
@Override
public void run(String... args) throws Exception {
System.err.printf("title = %s, version = %s%n", title, version) ;
}
}
运行结果
title = Pack, version = 1.0.0
6. 自定义结构化日志堆栈跟踪性
写入结构化日志的堆栈跟踪目前可以自定义,以限制其大小或以不同格式打印。你可以使用
logging.structured.json.stacktrace.* 属性来配置堆栈跟踪输出。
你可以使用以下一个或多个属性进行配置:
下面表格中的属性前缀:
logging.structured.json.stacktrace
|
属性名 |
描述 |
|
root |
指定堆栈跟踪的根项(即最内层的异常)的打印顺序。使用 last 表明将根项打印在最后(与 Java 的默认行为一样),或使用 first 表明将根项打印在最前面。 |
|
max-length |
设置堆栈跟踪应打印的最大长度(字符数)。 |
|
max-throwable-depth |
设置每个堆栈跟踪中应打印的最大帧数(包括公共帧和被抑制的帧)。 |
|
include-common-frames |
指定是否应包含公共帧(即多个异常中重复的帧)或将其移除。 |
|
include-hashes |
指定是否应在堆栈跟踪中包含其哈希值。 |
配置示例:
logging:
structured:
json:
stacktrace:
include-hashes: true
7. ClientHttpConnector Builder与 配置属性
使用WebClient 的用户目前可以使用属性进行全局配置,如超时和重定向设置。如下示例:
spring:
http:
reactiveclient:
settings:
connector: jetty
connect-timeout: 2s
read-timeout: 1s
redirects: dont-follow
8. 任务调用的任务装饰
如果存在 TaskDecorator bean,它将被应用到自动配置的 taskScheduler bean。它还将被应用到自动配置的
ThreadPoolTaskSchedulerBuilder 和
SimpleAsyncTaskSchedulerBuilder bean。任何使用这些构建器创建的调度器都将使用它,如下示例:
@Configuration
@EnableScheduling
public class TaskConfig {
@Bean
TaskDecorator taskDecorator() {
return new TaskDecorator() {
@Override
public Runnable decorate(Runnable runnable) {
return () -> {
System.err.println("任务装饰") ;
runnable.run() ;
};
}
};
}
}
9. 自定义Executor Bean
如果存在 Executor bean, Spring Boot 无论如何都自动配置一个 AsyncTaskExecutor。为此,请将
spring.task.execution.mode 属性设置为 force。
在此模式下运行时,它会确保所有集成(包括常规的 @Async 处理)都使用自动配置的执行器,除非定义了 AsyncConfigurer bean。如下示例:
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean
Executor executor() {
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 5, 60,
TimeUnit.SECONDS, new ArrayBlockingQueue<>(100), new ThreadFactory() {
private final AtomicInteger c = new AtomicInteger() ;
@Override
public Thread newThread(Runnable r) {
return new Thread(r, "pack - " + c.incrementAndGet()) ;
}
}) ;
return executor ;
}
}
配置文件
spring:
task:
execution:
mode: force
当执行异步任务时,运行结果:

注:上面的mode必须设置为force。这里打印的 “任务装饰” 是在上面8中配置的。
10. 自动配置bootstrapExecutor
Spring Boot 目前会在不存在的情况下自动配置一个名为 bootstrapExecutor 的 bean(异步创建Bean 实例)。要实现这一点,上下文中需要存在一个名为 applicationTaskExecutor 的 bean,如果你未定义自定义的 Executor bean,则这是默认的。这使得 bean 的后台初始化开箱即用。如下源码:

异步bean创建
@Bean(bootstrap = Bootstrap.BACKGROUND)
Person person() {
System.err.printf("%s - person bean create%n", Thread.currentThread().getName()) ;
return new Person() ;
}
运行结果

11. Actuator 'heapdump' 端点
目前,heapdump 这个 Actuator 端点的默认访问权限已设置为 access=NONE。这一改变旨在降低因应用程序配置错误而导致敏感信息泄露的风险。
如果您希望使用这个端点,目前不仅需要将其暴露出来,还需要配置其访问权限(而在以前,您只需将其暴露出来即可)。
要进行这样的配置,您可以使用类似于以下的配置方式:
management:
endpoints:
web:
exposure:
include: heapdump
endpoint:
heapdump:
access: unrestricted
通过这样的配置,可以确保 heapdump 端点在需要时可用,同时又能适当地控制其访问权限,以保护应用程序的安全。













- 最新
- 最热
只看作者