王炸!Spring Boot 3.5 震撼发布,强大的新特性来袭

环境:Spring Boot 3.5



Spring Boot3.5 更新的内容许多,接下来我将介绍11个比较不错的功能吧!

1. 严格的'.enabled'配置属性

.enabled 属性的支持值进行了严格限制,目前更加一致。值目前必须是 true 或 false。之前的 Spring Boot 版本有时会使用这样的条件:将任何非 false 的值都视为启用。

2. 自动配置的 TaskExecutor 名称

之前,Spring Boot 会自动配置一个名为 taskExecutorapplicationTaskExecutorTaskExecutor。从本次发布开始,只提供 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

作为 ServletRegistrationBeanFilterRegistrationBean 的基于注解的替代方案,添加了两个新注解。@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 

当执行异步任务时,运行结果:

王炸!Spring Boot 3.5 震撼发布,强劲的新特性来袭

注:上面的mode必须设置为force。这里打印的 “任务装饰” 是在上面8中配置的。

10. 自动配置bootstrapExecutor

Spring Boot 目前会在不存在的情况下自动配置一个名为 bootstrapExecutor 的 bean(异步创建Bean 实例)。要实现这一点,上下文中需要存在一个名为 applicationTaskExecutor 的 bean,如果你未定义自定义的 Executor bean,则这是默认的。这使得 bean 的后台初始化开箱即用。如下源码:

王炸!Spring Boot 3.5 震撼发布,强劲的新特性来袭

异步bean创建

 @Bean(bootstrap = Bootstrap.BACKGROUND)
Person person() {
  System.err.printf("%s - person bean create%n", Thread.currentThread().getName()) ;
  return  new Person() ;
}

运行结果

王炸!Spring Boot 3.5 震撼发布,强劲的新特性来袭

11. Actuator 'heapdump' 端点

目前,heapdump 这个 Actuator 端点的默认访问权限已设置为 access=NONE。这一改变旨在降低因应用程序配置错误而导致敏感信息泄露的风险。

如果您希望使用这个端点,目前不仅需要将其暴露出来,还需要配置其访问权限(而在以前,您只需将其暴露出来即可)。

要进行这样的配置,您可以使用类似于以下的配置方式:

management:
  endpoints:
    web:
      exposure:
        include: heapdump
  endpoint:
    heapdump:
      access: unrestricted

通过这样的配置,可以确保 heapdump 端点在需要时可用,同时又能适当地控制其访问权限,以保护应用程序的安全。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
兔堡零来声的头像 - 宋马
评论 共5条

请登录后发表评论