§Play 2.4 の新機能
このページでは、Play 2.4 の新機能について説明します。Play 2.4 への移行に必要な変更について学習したい場合は、Play 2.4 移行ガイドをご覧ください。
§依存関係注入
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 コンポーネントをインスタンス化するトレイト
Java と Scala の Play の依存関係注入サポートの詳細については、こちらをご覧ください。
§テスト
Play に依存関係注入を導入することの最大の利点の 1 つは、Play の多くの部分をはるかに簡単にテストできるようになったことです。Play は現在、コンポーネントのモックとオーバーライドを支援する多くの API を提供しており、Play アプリケーションの他の部分とは別に、Play コンポーネントとのインタラクションをテストすることもできます。
これらの新しい API についてはこちらをご覧ください。
- Java と Scala での Guice コンポーネントの構成
- Java と Scala でのデータベースアクセスコードのテスト
- Java と Scala での Web サービスクライアントコードのテスト
§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 は、Instance
、LocalDateTime
、LocalDate
を含む Java 8 の時間型をサポートするようになりました。
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()
)。 - 数値列とブール列の変換が改善されました。
- バイナリ列 (バイト、ストリーム、BLOB) の新しい変換により、
Array[Byte]
またはInputStream
として解析されます。 Long
、Date
、またはTimestamp
列から Joda のInstant
またはDateTime
への新しい変換。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 プロジェクトは こちらにあります。
play-ebean は Ebean 4.x をサポートするようになりました。
§HikariCP
デフォルトのJDBC接続プールにHikariCPが採用されました。そのプロパティは.conf
ファイルを使用して直接設定できます。HikariCPで期待されるものに合わせて設定プロパティの名前を変更する必要があります。
§WS
WSはHTTPSでServer Name Indication (SNI)をサポートするようになりました。これにより、CloudflareなどのSNIに大きく依存するHTTPSベースのCDNに関する多くの問題が解決されます。
§実験的機能
Playは2つの新しい実験的機能を提供します。これらの機能は、APIがまだ最終決定されておらず、リリースごとに変更される可能性があるため、「実験的」としてラベル付けされています。これらのAPIでは、バイナリ互換性が保証されません。
§Akka HTTPサポート
Playは、現在のNettyバックエンドの代替として、新しいAkka HTTPバックエンドをサポートします。使用方法については、Akka Http Serverを参照してください。
§Reactive Streamsサポート
PlayはReactive Streamsのiterateesベースの実装を提供し、Akka StreamsやRxJavaなどの他のReactive Streams実装をPlayのiteratee IO APIで使用できるようにします。詳細については、Reactive Streams Integrationを参照してください。
次へ: 移行ガイド
このドキュメントに誤りを見つけましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してご協力ください。ご質問やアドバイスがありましたら、コミュニティフォーラムでコミュニティとの会話を開始してください。