Play Framework
play-framework;响应式 Web。
30 分钟
Play Framework
Spring Boot 之外,Java 世界还有 Play——基于 Akka 的异步 Web 框架,路由即函数、模板即视图。本课让你体验「非 Spring」的 HTTP 编程模型,对照 spring-boot-essentials 理解 MVC 差异,并衔接 java-core-essentials 的 Future/CompletionStage 概念。
学习目标
- 用 Play 定义路由、Controller 与 JSON 响应
- 理解 Action 的异步返回
CompletionStage<Result> - 判断 Play 与 Spring Boot 各自适合的项目形态
路由与 Controller
conf/routes:
GET /api/books/:isbn controllers.BookController.show(isbn: String)
POST /api/books controllers.BookController.create
public class BookController extends Controller {
private final BookService books;
@Inject
public BookController(BookService books) {
this.books = books;
}
public Result show(String isbn) {
return books.findByIsbn(isbn)
.map(book -> ok(Json.toJson(book)))
.orElse(notFound("book not found: " + isbn));
}
public CompletionStage<Result> create(Http.Request request) {
BookForm form = Json.fromJson(request.body().asJson(), BookForm.class);
return books.saveAsync(form)
.thenApply(id -> created(Json.newObject().put("id", id)));
}
}
Play 用 Guice 注入依赖;@Inject 构造器与 Spring 类似,但无 @RestController 魔法——路由文件显式绑定 URL。
异步 Action
Play 鼓励 I/O 密集操作用非阻塞线程:
public CompletionStage<Result> index() {
return CompletableFuture.supplyAsync(() -> books.listAll())
.thenApply(list -> ok(Json.toJson(list)));
}
线程池由框架管理,避免「一请求一线程」在高并发下耗尽 Tomcat 线程——这与 Spring WebFlux 的设计哲学相近,但 API 风格不同。
Play vs Spring Boot
| 维度 | Play | Spring Boot |
|---|---|---|
| 路由 | routes 文件声明 | 注解 @GetMapping |
| 模板 | Twirl(Scala 模板) | Thymeleaf / 前后端分离 |
| 生态 | 中小规模、Scala/Java 混用 | 企业标准、starter 丰富 |
| 学习 | 需理解 async Action |