文档

§Play 2.4 中的新功能

本页重点介绍 Play 2.4 的新功能。如果您想了解迁移到 Play 2.4 所需的更改,请查看 Play 2.4 迁移指南

§依赖注入

Play 现在开箱即用地支持依赖注入。

§动机

Play 的长期策略是消除 Play 对全局状态的依赖。Play 目前在静态变量中存储对当前应用程序的引用,然后在整个代码库中的许多地方使用此变量。消除此依赖具有以下优点

然而,消除 Play 的全局状态是一项艰巨的任务,需要对 Play 应用程序的编写方式进行一些破坏性更改。我们正在采取的方法是在 Play 2.4 中尽可能多地完成这项工作,同时保持向后兼容性。在一段时间内,许多 Play 的 API 将同时支持依赖全局状态的方法和不依赖全局状态的方法,允许您逐步迁移应用程序以不再依赖全局状态,而不是在升级到 Play 2.4 时一次性完成所有迁移。

消除全局状态的第一步是使 Play 组件能够获得其依赖项,而不是静态地查找它们。这意味着提供开箱即用的依赖注入支持。

§方法

在 Java 生态系统中,依赖注入的方案通常在 JSR 330 中达成共识,但最佳实现方式存在广泛争议,许多现有的实现方案相互竞争,例如 Guice、Spring 和 JEE 本身。

在 Scala 生态系统中,依赖注入的方案没有达成普遍共识,存在许多相互竞争的编译时和运行时依赖注入方案。

Play 在提供依赖注入解决方案方面的理念是,对允许的方案保持中立,但对我们记录和提供的开箱即用方案持明确意见。为此,我们提供了以下内容:

您可以阅读有关 Play 依赖注入支持的更多信息,了解 JavaScala

§测试

将依赖注入引入 Play 的最大优势之一是,现在可以更轻松地测试 Play 的许多部分。Play 现在提供了一些 API 来帮助模拟和覆盖组件,以及能够在与 Play 应用程序的其他部分隔离的情况下测试与 Play 组件的交互。

您可以在此处了解这些新 API

§嵌入 Play

现在可以轻松地嵌入 Play 应用程序。Play 2.4 提供了用于启动和停止 Play 服务器的 API,以及 Java 和 Scala 的路由 DSL,以便可以将路由直接嵌入代码中。

在 Java 中,请参阅 嵌入 Play 以及有关 路由 DSL 的信息。

在 Scala 中,请参阅 嵌入 Play 以及有关 字符串插值路由 DSL 的信息。

§聚合反向路由器

Play 现在支持将来自多个子项目的反向路由器聚合到单个共享项目中,而无需依赖路由文件所在的项目。这允许模块化 Play 应用程序将 Play 反向路由器用作模块之间的 API,使它们能够相互渲染 URL,而无需相互依赖。这也意味着可以从 Play 项目中提取一个无依赖的反向路由器并发布,供调用该项目提供的 API 的外部项目使用。

有关如何配置此功能的详细信息,请参阅 聚合反向路由器

§Java 8 支持

Play 2.4 现在需要 JDK 8。因此,Play 可以开箱即用地提供对 Java 8 数据类型的支持。例如,Play 的 JSON API 现在支持 Java 8 时间类型,包括 InstanceLocalDateTimeLocalDate

Play 文档现在使用 Java 8 语法为匿名内部类显示代码示例。例如,以下是一些代码示例的更改方式

之前

return promise(new Function0<Integer>() {
  public Integer apply() {
    return longComputation();
  }
 }).map(new Function<Integer,Result>() {
  public Result apply(Integer i) {
    return ok("Got " + i);
  }
});

之后

return promise(() -> longComputation())
  .map((Integer i) -> ok("Got " + i));

§Maven/sbt 标准布局

Play 现在允许您使用其默认布局或 Maven 和 sbt 项目的默认目录布局。有关更多详细信息,请参阅 Play 应用程序的结构 页面。

§Anorm

Anorm 已被提取到一个单独的项目中,该项目具有自己的生命周期,允许 Anorm 以自己的速度发展,不受 Play 的约束。Anorm 项目可以在 这里 找到。

Anorm 中的新功能包括

§Ebean

Play 的 Ebean 支持已被提取到一个单独的项目中,该项目具有自己的生命周期,允许 Ebean 支持以自己的速度发展,不受 Play 的约束。play-ebean 项目可以在 这里 找到。

play-ebean 现在支持 Ebean 4.x。

§HikariCP

HikariCP 现在是默认的 JDBC 连接池。它的属性可以使用 .conf 文件直接配置,您应该将配置属性重命名为与 HikariCP 预期的一致。

§WS

WS 现在支持 HTTPS 中的服务器名称指示 (SNI) - 这解决了 HTTPS 基于 CDN(如 Cloudflare)的许多问题,这些 CDN 严重依赖 SNI。

§实验性功能

Play 提供了两个新的实验性功能。 这些功能被标记为实验性,因为它们的 API 尚未最终确定,并且可能会在不同版本之间发生变化。 这些 API 的二进制兼容性不受保证。

§Akka HTTP 支持

Play 支持一个新的 Akka HTTP 后端,作为当前 Netty 后端的替代方案。 有关使用它的说明,请参阅 Akka Http 服务器

§Reactive Streams 支持

Play 提供了一个基于迭代器的 Reactive Streams 实现,允许其他 Reactive Streams 实现(例如 Akka Streams 或 RxJava)与 Play 的迭代器 IO API 一起使用。 有关更多信息,请参阅 Reactive Streams 集成

下一步:迁移指南


发现此文档中的错误? 此页面的源代码可以在 这里 找到。 在阅读 文档指南 后,请随时贡献拉取请求。 有问题或建议要分享? 转到 我们的社区论坛 与社区开始对话。