问题

Spring6.0和SpringBoot3.0有什么新特性?

答案

1. 核心概念

Spring 6.0和SpringBoot 3.0是Spring生态的重大版本升级(2022年11月发布),引入了现代化的技术栈,提升了性能、可观测性和云原生支持。

2. 基础要求变化

(1) JDK版本要求

  • Spring 5.x / SpringBoot 2.x:最低JDK 8,推荐JDK 11
  • Spring 6.0 / SpringBoot 3.0最低JDK 17(必须)

JDK 17关键特性

  • Records(记录类)
  • Sealed Classes(密封类)
  • Pattern Matching for switch
  • Text Blocks(文本块)
// 使用Records简化DTO
public record UserDTO(Long id, String name, String email) {}

// Sealed Classes限制继承
public sealed class Shape permits Circle, Rectangle, Triangle {}

(2) Jakarta EE 9+

javax.* 命名空间迁移到 jakarta.*:

// Spring 5.x / SpringBoot 2.x
import javax.servlet.http.HttpServletRequest;
import javax.persistence.Entity;

// Spring 6.0 / SpringBoot 3.0
import jakarta.servlet.http.HttpServletRequest;
import jakarta.persistence.Entity;

影响的包

  • javax.servlet.*jakarta.servlet.*
  • javax.persistence.*jakarta.persistence.*
  • javax.validation.*jakarta.validation.*
  • javax.annotation.*jakarta.annotation.*

3. Spring 6.0核心新特性

(1) 原生编译支持(GraalVM Native Image)

传统JVM启动

  • 启动时间:1-5秒
  • 内存占用:200-500MB

原生镜像启动

  • 启动时间:0.05-0.1秒(毫秒级)
  • 内存占用:20-50MB
<!-- 添加Native插件 -->
<plugin>
    <groupId>org.graalvm.buildtools</groupId>
    <artifactId>native-maven-plugin</artifactId>
</plugin>
# 构建原生镜像
mvn -Pnative native:compile

# 运行原生可执行文件
./target/myapp

优势场景

  • Serverless函数(AWS Lambda、Azure Functions)
  • 微服务快速伸缩
  • 容器化部署(减少资源占用)

(2) HTTP接口声明式客户端

类似Feign的声明式HTTP客户端(基于接口自动生成实现):

// 定义HTTP接口
@HttpExchange("/api/users")
public interface UserClient {

    @GetExchange("/{id}")
    User getUserById(@PathVariable Long id);

    @PostExchange
    User createUser(@RequestBody User user);

    @PutExchange("/{id}")
    void updateUser(@PathVariable Long id, @RequestBody User user);

    @DeleteExchange("/{id}")
    void deleteUser(@PathVariable Long id);
}

// 配置
@Configuration
public class HttpClientConfig {

    @Bean
    public UserClient userClient() {
        WebClient webClient = WebClient.builder()
            .baseUrl("http://localhost:8080")
            .build();

        HttpServiceProxyFactory factory = HttpServiceProxyFactory
            .builder(WebClientAdapter.forClient(webClient))
            .build();

        return factory.createClient(UserClient.class);
    }
}

// 使用
@Service
public class UserService {
    @Autowired
    private UserClient userClient;

    public User getUser(Long id) {
        return userClient.getUserById(id);
    }
}

(3) Observability改进(可观测性)

集成Micrometer Tracing(原SpringCloud Sleuth):

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
<dependency>
    <groupId>io.zipkin.reporter2</groupId>
    <artifactId>zipkin-reporter-brave</artifactId>
</dependency>

自动生成Trace ID和Span ID

management:
  tracing:
    sampling:
      probability: 1.0  # 采样率100%
  zipkin:
    tracing:
      endpoint: http://localhost:9411/api/v2/spans

日志输出:

2023-11-02 10:30:15.123 INFO [myapp,64a3f5e4b6c7d8e9,64a3f5e4b6c7d8e9] - Processing request
                                  ↑ Trace ID        ↑ Span ID

(4) 虚拟线程支持(Project Loom)

JDK 21引入的虚拟线程支持:

spring:
  threads:
    virtual:
      enabled: true  # 启用虚拟线程

性能提升

  • 传统线程:创建成本高,线程池大小受限
  • 虚拟线程:轻量级,可创建百万级线程
@GetMapping("/blocking")
public String blockingCall() {
    // 自动使用虚拟线程处理,不阻塞平台线程
    Thread.sleep(1000);
    return "Done";
}

(5) @RegisterReflectionForBinding注解

支持GraalVM原生镜像的反射配置:

@RegisterReflectionForBinding({User.class, Order.class})
@Configuration
public class ReflectionConfig {
    // 自动为User和Order类注册反射元数据
}

4. SpringBoot 3.0核心新特性

(1) spring.factories移除

SpringBoot 2.x

# META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration

SpringBoot 3.0

# META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
com.example.MyAutoConfiguration

优势

  • 解析更快(纯文本 vs Properties格式)
  • 避免换行符问题
  • 更清晰的结构

(2) 依赖升级

组件 SpringBoot 2.7 SpringBoot 3.0
Spring Framework 5.3.x 6.0.x
JDK 8+ 17+
Tomcat 9.x 10.x
Jetty 9.x 11.x
Hibernate 5.6.x 6.1.x
Micrometer 1.9.x 1.10.x

(3) 配置属性迁移工具

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-properties-migrator</artifactId>
    <scope>runtime</scope>
</dependency>

启动时自动提示废弃配置

***************************
APPLICATION FAILED TO START
***************************

Property 'server.max-http-header-size' is deprecated.
  Replacement: server.max-http-request-header-size

(4) Auto-configuration优化

  • 更细粒度的条件注解评估
  • 延迟初始化优化
  • 启动时间减少10-20%

(5) Actuator改进

新增端点

  • /actuator/sbom:查看软件物料清单(SBOM)
  • /actuator/startup:分析启动性能
management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,sbom,startup

(6) Docker镜像优化

分层构建优化

# 使用Buildpacks构建
mvn spring-boot:build-image

# 生成分层Dockerfile
FROM eclipse-temurin:17-jre as builder
WORKDIR application
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract

FROM eclipse-temurin:17-jre
WORKDIR application
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]

5. 迁移注意事项

(1) 依赖冲突检查

# 检查依赖树
mvn dependency:tree

# 查找javax依赖
mvn dependency:tree | grep javax

(2) 代码迁移

批量替换工具:OpenRewrite

<plugin>
    <groupId>org.openrewrite.maven</groupId>
    <artifactId>rewrite-maven-plugin</artifactId>
    <configuration>
        <activeRecipes>
            <recipe>org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_0</recipe>
        </activeRecipes>
    </configuration>
</plugin>
# 执行迁移
mvn rewrite:run

(3) 第三方库兼容性

常见问题:

  • Swagger 2.x:不兼容,需升级到SpringDoc OpenAPI
  • Hibernate Validator 6.x:升级到8.x
  • Lombok:需升级到1.18.24+

6. 性能对比

指标 SpringBoot 2.7 SpringBoot 3.0 改进
启动时间(JVM) 2.5s 2.0s -20%
启动时间(Native) - 0.08s -96%
内存占用(JVM) 350MB 320MB -8%
内存占用(Native) - 40MB -88%
吞吐量 10000 req/s 12000 req/s +20%

7. 面试答题要点总结

核心变化

  1. JDK版本:强制要求JDK 17,支持Records、Sealed Classes等新特性
  2. 命名空间迁移:javax.* → jakarta.*(Jakarta EE 9+)
  3. 原生编译:GraalVM Native Image支持,毫秒级启动
  4. 声明式HTTP客户端:基于接口的HTTP客户端,类似Feign
  5. 可观测性:集成Micrometer Tracing,统一Metrics、Tracing、Logging
  6. spring.factories移除:改用AutoConfiguration.imports文件
  7. 虚拟线程:支持JDK 21虚拟线程,提升并发性能

选择建议

  • 新项目:直接使用SpringBoot 3.0
  • 老项目:评估第三方库兼容性后逐步迁移
  • 云原生场景:充分利用Native Image和Observability特性

一句话总结:Spring 6.0和SpringBoot 3.0以JDK 17为基线,引入了GraalVM原生编译、Jakarta EE规范、Observability改进等重大特性,显著提升了性能、可观测性和云原生能力,是面向现代化Java应用开发的重要升级。