Play!frameworkの2.1がリリースされたのでハイライトまとめた

昨日、Playframeworkの新バージョン、2.1がリリースされたので、ハイライトとして紹介されている機能をメモっておきます。
僕の英語力が壊滅的に低いおかげで正確性は期待できないため、本家こちらも参照されることをおすすめします。

Scala 2.10との統合

Scala 2.10準拠になったそうなので、アプリケーションコードからも2.10の新機能が使えるそう。
合わせて、Playの実行時のScalaバージョンとsbtで利用するScalaのバージョンの依存性を排除したので、unstableなバージョンのScalaをアプリで試す、みたいなことが簡単にできるようになったらしい。

scala.concurrent.Futureとの統合

Playの内部実装もscala.concurrent.Futureを利用したものに置き換えられ、アプリコードやライブラリも直接FutureのAPIを使えるようになり、それによってより簡単に非同期処理が書ける…らしい。

モジュール化

いくつかのサブプロジェクトにコンポーネントが分離されたようです。
これによって、利用するコンポーネントはBuild.scalaの中で適切に選択しないといけなくなった代わりに、Playのcore自体は小さくなったらしい。
Playのcore単体では軽量でハイパフォーマンスな非同期HTTPサーバとして使えるとの事。

サブプロジェクト分割のサポート

プロジェクトリソースの再利用などのために、サブプロジェクトを定義して、プロジェクト間で依存性を定義できるようになったらしい。
これはsbtの機能に追随したのかしら?

非同期callbackの中でHttp.Contextが使えるようになった。

以前は使えませんでした。

同一Http.Context化で非同期callbackを並列処理しないようにした

可変オブジェクトを複数の非同期callbackの中で共有すると、プログラマが同期化で防御してない限りスレッドアンセーフだったけど、Play2.1では同じHttp.Context下のcallbackを並列処理しない(シーケンシャル処理にする)ことでこれを回避したらしい。
ただしこれらのcallbackが同じスレッドで実行されるという保証はないとのこと。

コントローラをインスタンス化出来るようになった

新しく追加された記法でroutesに定義すると、Controllerのインスタンス化が出来る(管理できる)ようになるらしい。
Globalクラスの追加メソッドをオーバーライドすると、例えばDIフレームワーク使って、コントローラのフィールドに宣言してあるServiceクラスに自動的にインスタンスを注入する、みたいなことができるようになるっぽい。

新しいScalaJSON APIが増えた

変換とかバリデーションが便利になったらしい。for Scala

新しいよりシンプルなフィルタAPIが増えた

Actionの合成のことだろうか?
EssentialActionとか言うのがscala側にしかAPI無かったのでScala用の機能追加?

Playが利用してるCommonJSの実装がgoogle closureからRequireJSに変更

DEVモード以外ではminifyやcombineするけど、DEVモードで起動した場合、jsの依存性(include?)解決はブラウザ側でやる、とのこと。
学がないのでよく分からない。

Content negotiationの改善

Acceptsクラス使えば、リクエストのAcceptヘッダによってレスポンスフォーマットを切り替えるのが楽になるよ、とのこと。
これもScalaっぽい。


どれ一つとして試してないので「らしい」だとか「っぽい」だとかばっかりですがご了承ください。
個人的にはサブプロジェクト分割できるとか、本体のモジュール化とか嬉しい。
サイズ大きすぎてdistしたバイナリをデプロイするのも一苦労なので…。