前言
大家好,我是大华!有很多朋友不知道Springboot2.x和3.x有什么区别,用着感觉都差不多。其实3.x是一个重大版本升级。
为什么 Spring Boot 3.x 这么重要?
因为它不仅仅是加了几个新功能,而是整个技术地基都变了。
下面我们举几个例子来了解一下。
1. 包名的更新:javax → jakarta
这是2.x升级到3.x时,改动最大的地方。
Spring Boot 2.x(老代码)
java
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.servlet.http.HttpServletRequest;
@Entity
public class User {
@Id
private Long id;
private String name;
// getter/setter
}
Spring Boot 3.x(新代码)
java
import jakarta.persistence.Entity; // 注意:javax → jakarta
import jakarta.persistence.Id;
import jakarta.servlet.http.HttpServletRequest; // 同样变了
@Entity
public class User {
@Id
private Long id;
private String name;
// getter/setter
}
划重点:
- 所有
javax.*都要改成jakarta.*! - 如果你用的是 JPA、Servlet、Validation 等技术,几乎每个 Java 文件都要改。
- 建议使用 IDE 的全局替换功能,但要小心第三方库是否支持。
2. 安全配置
Spring Boot 3.x 默认使用 Spring Security 6,配置方式大变。
Spring Boot 2.x 配置方式
java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/public/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin();
}
}
注意:WebSecurityConfigurerAdapter在Spring Security 6中已被废弃!
Spring Boot 3.x 推荐方式(使用 Lambda DSL)
java
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authz -> authz
.requestMatchers("/public/**").permitAll()
.anyRequest().authenticated()
)
.formLogin(form -> form
.loginPage("/login")
.permitAll()
);
return http.build();
}
}
好处:
- 更函数式,代码更清晰。
- 不用继承,更灵活。
- 编译时就能发现错误,而不是运行时报错。
3. 原生镜像(GraalVM)
Spring Boot 3.x 原生支持 GraalVM,可以把 Java 应用编译成原生可执行文件。
如何启用原生镜像?
在 pom.xml 中加入插件:
xml
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
</plugin>
然后运行:
bash
./mvnw -Pnative native:compile
编译完成后,你会得到一个不依赖 JVM 的可执行文件 ,比如 myapp。
运行它:
bash
./myapp
你会发现:
- 启动时间:从 5 秒 → 0.1 秒
- 内存占用:从 300MB → 50MB
特别适合:Serverless、微服务、边缘计算等资源敏感场景。
4. 云原生支持:Liveness 和 Readiness
Spring Boot 3.x 的健康检查更专业,适合 Kubernetes。
配置 application.yml
yaml
management:
endpoint:
health:
show-details: always
endpoints:
web:
exposure:
include: health,info,liveness,readiness
访问新端点
GET /actuator/health/liveness→ 检查应用是否"活着"(是否崩溃)GET /actuator/health/readiness→ 检查应用是否"就绪"(是否可以接收流量)
K8s 可以用这两个接口做更精准的健康检查,避免误杀或误导流。
那我现在该升级吗?
看情况!分两种:
推荐升级的情况:
- 新项目:直接上 Spring Boot 3.x + Java 17!
- 想玩原生镜像:追求极致性能和启动速度。
- 云原生项目:用 K8s、微服务架构。
暂缓升级的情况:
- 还在用 Java 8:必须先升级 JDK。
- 依赖老旧库 :比如某些中间件 SDK 还不支持
jakarta。 - 项目稳定,无大改动:可以等下次大版本迭代时再升级。
总结对比表
| 特性 | Spring Boot 2.x | Spring Boot 3.x |
|---|---|---|
| 最低 Java 版本 | Java 8 | Java 17 |
| 包名 | javax.* |
jakarta.* |
| 原生镜像 | 不支持 | 原生支持 |
| Spring Security | 继承 WebSecurityConfigurerAdapter |
使用 DSL 配置 |
| 云原生支持 | /health |
/liveness, /readiness |
| 未来支持 | 逐渐停止 | 主推版本 |
最后一句话
SpringBoot3.x不是可选项,而是Java 开发现代化的必经之路。
早点了解,早点准备,别等到公司要求升级时,你还在问"javax和jakarta有啥区别?"
另外SpringBoot4.x很快就发布正式版了,可以关注一下。
本文首发于公众号:程序员刘大华,专注分享前后端开发的实战笔记。关注我,少走弯路,一起进步!