选择哪个框架取决于你的项目需求、团队熟悉度以及技术栈,下面我将从 传统巨头、现代新锐 和 无服务器/云原生 三个维度,为你介绍几个最核心和流行的 Java RESTful 框架。

传统巨头:Spring Boot (Spring MVC)
这是目前 Java 生态中最流行、最主流的框架,几乎成为了企业级 Java 开发的标准配置,它本身不是一个独立的框架,而是对 Spring 框架的“极速”封装。
核心思想
- 约定优于配置:通过大量的自动配置(Auto-configuration),让你几乎不用写任何 XML 配置就能快速搭建一个生产级别的应用。
- 内嵌服务器:无需部署 WAR 文件,可以直接将应用打包成一个可执行的 JAR 文件,通过内嵌的 Tomcat、Jetty 或 Undertow 运行。
- Starter 依赖:提供了一系列的 "starter" 依赖(如
spring-boot-starter-web),简化了 Maven/Gradle 的依赖管理。
核心组件
@RestController:这是一个组合注解,相当于@Controller+@ResponseBody,标记了该类的所有方法都会返回 JSON 或 XML 等格式的数据,而不是一个视图。@RequestMapping/@GetMapping/@PostMapping等:用于映射 HTTP 请求到具体的处理方法上,现代开发更推荐使用@GetMapping、@PostMapping等更具体的注解,它们语义更清晰。@PathVariable:用于从 URL 路径中获取参数。@GetMapping("/users/{id}")可以获取 URL 中/users/123的123。@RequestParam:用于获取查询参数(Query Parameters)。@GetMapping("/search")可以获取 URL 中?name=John&age=30的name和age。@RequestBody:用于将 HTTP 请求的 body 内容(通常是 JSON)自动绑定到 Java 对象上。
示例代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.*;
// @SpringBootApplication 是一个组合注解,包含了 @Configuration, @EnableAutoConfiguration, @ComponentScan
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
@RestController
@RequestMapping("/api/users") // 为这个控制器下的所有方法设置基础路径
public class UserController {
// GET /api/users/1
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
// 模拟从数据库获取用户
return new User(id, "John Doe", "john.doe@example.com");
}
// POST /api/users
@PostMapping
public User createUser(@RequestBody User user) {
// 模拟将用户保存到数据库
System.out.println("Creating user: " + user);
// 通常会返回一个包含新创建资源的 ID 的完整对象
user.setId(101L);
return user;
}
// GET /api/users?name=John
@GetMapping
public List<User> searchUsers(@RequestParam(required = false) String name) {
// 模拟根据 name 搜索用户
return List.of(new User(1L, name, "john@example.com"));
}
}
// 一个简单的 POJO (Plain Old Java Object)
class User {
private Long id;
private String name;
private String email;
// 构造器、Getter 和 Setter 方法 (省略...)
}
优缺点
- 优点:
- 生态极其庞大:几乎所有你能想到的功能都有现成的 Spring Boot Starter(如数据库、缓存、消息队列、安全等)。
- 社区活跃:遇到任何问题,都能轻松找到解决方案和大量的第三方库。
- 企业级成熟:经过多年发展,非常稳定,适合构建复杂的大型应用。
- 学习曲线平缓:对于有 Spring 基础的开发者来说非常容易上手。
- 缺点:
- “魔法”太多:对于初学者,自动配置和“Starter”机制有时会显得不透明,难以排查问题。
- 项目启动相对较慢:因为需要加载大量的 Spring 上下文。
现代新锐:Jakarta EE (原 Java EE) / JAX-RS
这是 Java 官方定义的用于构建 RESTful Web 服务的标准规范,它不是实现,而是一套 API,你可以选择不同的实现,如 RESTEasy、Jersey 或 Apache CXF。
在 Java 11 之后,Java EE 已更名为 Jakarta EE。
核心思想
- 基于注解,轻量级:与 Spring 的“全家桶”不同,JAX-RS 标准本身非常轻量,只专注于 Web 服务。
- 实现无关:你可以基于 JAX-RS 规范编写代码,然后轻松地在不同的实现(如 Jersey, RESTEasy)之间切换。
- 标准化:作为 Java 标准,它具有很好的稳定性和跨平台性。
核心注解
@Path:对应 Spring 的@RequestMapping,用于定义资源路径。@GET,@POST,@PUT,@DELETE:直接对应 HTTP 方法。@PathParam:对应 Spring 的@PathVariable。@QueryParam:对应 Spring 的@RequestParam。@Produces/@Consumes:明确声明方法可以生产(返回)或消费(接收)的媒体类型,如@Produces(MediaType.APPLICATION_JSON)。@Inject:用于依赖注入(通常配合 CDI)。
示例代码 (以 RESTEasy 为例)
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
// @ApplicationPath 是可选的,用于定义 JAX-RS 应用的根路径
@Path("/api/users")
public class UserResource {
// 模拟一个数据库
private final ConcurrentMap<Long, User> userDb = new ConcurrentHashMap<>();
private long currentId = 1;
// GET /api/users/1
@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public User getUserById(@PathParam("id") long id) {
return userDb.get(id);
}
// POST /api/users
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response createUser(User user) {
user.setId(currentId++);
userDb.put(user.getId(), user);
// 返回 201 Created 状态码和包含新资源位置的响应头
return Response.status(Response.Status.CREATED).entity(user).build();
}
// GET /api/users?name=John
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<User> searchUsers(@QueryParam("name") String name) {
List<User> result = new ArrayList<>();
for (User user : userDb.values()) {
if (user.getName().equals(name)) {
result.add(user);
}
}
return result;
}
}
class User { /* ... 同上 ... */ }
优缺点
- 优点:
- 轻量、标准:如果你只需要一个纯粹的 REST 服务,JAX-RS 是一个非常好的选择,没有 Spring 的额外开销。
- 实现灵活:可以自由选择实现,甚至可以在同一个应用中混合使用。
- 与 Java EE 应用服务器集成度高:在传统的 Java EE 应用服务器(如 WildFly, Payara)中是原生支持的。
- 缺点:
- 生态系统不如 Spring:虽然稳定,但社区和第三方库的丰富程度远不及 Spring。
- 功能相对单一:如果你需要构建一个包含数据库、安全、缓存等复杂功能的应用,你需要自己整合这些组件,不如 Spring Boot 方便。
无服务器/云原生框架:Quarkus
Quarkus 是一个为 Java 虚拟机和原生编译(GraalVM)而设计的“超音速”的、面向云原生和 Serverless 架构的 Java 堆栈。

核心思想
- 极致的启动速度和低内存占用:非常适合 Kubernetes 和 Serverless 环境,这些环境要求应用能够快速冷启动。
- 统一编程模型:将 imperative(命令式,如 JAX-RS)和 reactive(响应式)编程模型无缝结合。
- 提前优化:在编译时进行大量的分析和优化,而不是在运行时。
核心特点
- JAX-RS 的超集:Quarkus 完全兼容 JAX-RS 标准(使用 RESTEasy 作为默认实现),JAX-RS 的代码可以直接在 Quarkus 上运行。
- Live Reload:在开发模式下,修改代码后无需重启应用,浏览器刷新即可看到效果,极大提升了开发效率。
- 原生编译:可以编译成一个独立的、包含运行时的原生可执行文件,启动时间可达毫秒级,内存占用极小。
示例代码
Quarkus 的代码与 JAX-RS/RESTAlmost 完全一样!
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import java.util.List;
@Path("/api/users")
public class UserResource {
// Quarkus 会自动注入 CDI Bean,这里简化了示例
// @Inject
// UserRepository userRepository;
@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public User getUserById(@PathParam("id") long id) {
// userRepository.findById(id);
return new User(id, "Quarkus User", "quarkus@example.com");
}
// ... 其他方法同上 ...
}
优缺点
- 优点:
- 性能卓越:无论是启动速度还是运行时性能,都非常出色。
- 现代化:专为云原生设计,与 Kubernetes、Service Mesh 等现代技术栈完美集成。
- 开发体验好:Live Reload 功能非常吸引人。
- 缺点:
- 学习曲线陡峭:它的一些核心概念(如 Reactive、Quarkus 扩展机制)需要时间去理解。
- 生态相对年轻:虽然发展很快,但生态和社区规模仍然小于 Spring Boot。
- 并非所有 Java 库都支持原生编译:在使用第三方库时需要注意其是否与 GraalVM 兼容。
总结与对比
| 特性 | Spring Boot | Jakarta EE / JAX-RS | Quarkus |
|---|---|---|---|
| 定位 | 全能型企业级框架 | 标准、轻量级 Web 服务规范 | 云原生、Serverless 框架 |
| 核心优势 | 生态庞大、功能全面、社区成熟 | 标准、轻量、实现无关 | 极致性能、快速启动、低内存 |
| 开发体验 | 非常成熟,Starter 依赖简化开发 | 标准,上手快,但需自己整合组件 | Live Reload 体验极佳,原生编译强大 |
| 性能 | 良好,但启动和内存占用较高 | 良好 | 极佳,原生编译后性能和启动速度是数量级提升 |
| 适用场景 | 大型企业级应用、复杂业务系统 | 纯粹的 REST API、微服务、集成到现有 EE 环境 | 云原生应用、Kubernetes、Serverless、对性能和启动时间有严苛要求的场景 |
| 学习成本 | 中等(Spring 生态博大精深) | 低(注解少,概念简单) | 较高(需要了解云原生和响应式编程) |
如何选择?
- 如果你是新手,或者正在构建一个传统的、功能复杂的企业级应用:首选 Spring Boot,它的生态和文档能帮你解决绝大多数问题,是目前最稳妥、最主流的选择。
- 如果你只需要构建一个简单的 RESTful API,或者项目要求使用 Java 标准技术栈:考虑 Jakarta EE / JAX-RS,它更轻量,没有“魔法”,代码更纯粹。
- 如果你的目标是上云、部署到 Kubernetes,或者对应用的启动时间和内存占用有极致要求:强烈推荐 Quarkus,它是面向未来的技术,能充分发挥云原生架构的优势。

