§Play 2.4 的新功能
此頁面重點介紹 Play 2.4 的新功能。如果您想了解移轉到 Play 2.4 所需的變更,請查看 Play 2.4 移轉指南。
§相依性注入
Play 現在支援開箱即用的相依性注入。
§動機
Play 的長期策略是移除 Play 對全域狀態的相依性。Play 目前會將對目前應用程式的參考儲存在靜態變數中,然後在程式碼庫的許多地方使用這個變數。移除此變數具有下列優點
- 應用程式變得更容易測試,而元件也變得更容易模擬。
- 更多有趣的部署情境變得可行,例如在單一 JVM 中有多個 Play 執行個體,或內嵌輕量級 Play 應用程式。
- 應用程式生命週期變得更容易追蹤和推論。
移除 Play 的全域狀態是一個龐大的任務,需要對 Play 應用程式的撰寫方式進行一些破壞性的變更。我們採取的方法是在維持向後相容性的同時,在 Play 2.4 中盡可能執行此項任務。一段時間內,Play 的許多 API 將同時支援依賴全域狀態和不依賴全域狀態的方法,讓您能夠逐步將應用程式移轉至不依賴全域狀態,而不是在升級到 Play 2.4 時一次執行所有移轉。
移除全域狀態的第一步是讓 Play 元件的相依性由元件提供,而不是靜態查詢。這表示提供相依性注入的現成支援。
§方法
在 Java 生態系統中,相依性注入的方法通常在 JSR 330 中達成共識,但正確的實作備受爭論,有許多現有的競爭實作,例如 Guice、Spring 和 JEE 本身。
在 Scala 生態系統中,相依性注入的方法並未達成共識,有許多競爭的編譯時間和執行時間相依性注入方法。
Play 在提供相依性注入解決方案時的哲學是不對我們允許的方法發表意見,但對我們記錄和現成提供的做法發表意見。因此,我們提供了下列內容
- 現成使用 Guice 的實作
- 允許插入其他 JSR 330 實作的抽象
- 所有 Play 元件都可以使用純粹的建構函式或工廠方法進行實例化
- 實例化 Play 元件的特質,可以在類似 cake 模式的樣式中混合在一起,以協助編譯時間相依性注入
您可以在 Java 和 Scala 中進一步瞭解 Play 的依賴注入支援。
§測試
將依賴注入引入 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 時間類型,包括 Instance
、LocalDateTime
和 LocalDate
。
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 中的新功能包括
Row
上的新位置取得器。- 統一欄位解析,無論標籤為何(名稱或別名)。
- 新的串流 API;函數
fold
和foldWhile
可用於結果串流(例如SQL"Select count(*) as c from Country".fold(0l) { (c, _) => c + 1 }
)。函數withResult
可提供自訂串流解析器(例如SQL("Select name from Books").withResult(customTailrecParser(_, List.empty[String]))
)。 - 支援來自欄位的陣列(
java.sql.Array
)(例如SQL("SELECT str_arr FROM tbl").as(scalar[Array[String]].*)
)或作為參數(例如SQL"""UPDATE Test SET langs = ${Array("fr", "en", "ja")}""".execute()
)。 - 改善數值和布林欄位的轉換。
- 新的二進位欄位(位元組、串流、二進位大型物件)轉換,可將它們解析為
Array[Byte]
或InputStream
。 - 新的 Joda
Instant
或DateTime
轉換,來自Long
、Date
或Timestamp
欄位。 - 新增轉換,以支援
List[T]
、Set[T]
、SortedSet[T]
、Stream[T]
和Vector[T]
作為多值參數。 - 新的轉換,可將文字欄位解析為 UUID(例如
SQL("SELECT uuid_as_text").as(scalar[java.util.UUID].single)
)。
§Ebean
Play 的 Ebean 支援已萃取出一個獨立專案,擁有自己的生命週期,讓 Ebean 支援可以按照自己的步調進行,不受 Play 限制。play-ebean 專案可在此處找到 here。
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 整合。
下一步:移轉指南
在這個文件找到錯誤?此頁面的原始程式碼可以在 這裡 找到。在閱讀 文件指南 後,請隨時提交拉取請求。有問題或建議要分享?前往 我們的社群論壇 與社群開始對話。