kagamihogeの日記

kagamihogeの日記です。

Spring Framework Reference Documentation 4.1.5のPart II. What’s New in Spring Framework 4.xをテキトーに訳した

http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/ のPart IIをテキトーに訳した

ここまでイントロダクション。

Part II. What’s New in Spring Framework 4.x

3. New Features and Enhancements in Spring Framework 4.0

Spring Frameworkの最初のリリースは2004年で、それ以来メジャーバージョンアップを重ねており、Spring 2.0はXMLネームスペースとAspectJサポートを行い、Spring 2.5はアノテーションによる設定を取り込み、Spring 3.0はフレームワークのコードベース全体にJava 5+の基本機能、例えば@Configurationモデルの機能など、を導入しました。

Version 4.0はSpring Frameworkの最新メジャーリリースで、はじめて完全にJava 8の機能をサポートしています。Java 8より古いバージョンでSpringを動かすことも可能で、Java SE 6以上が最低限必要です。また、メジャーリリースを契機に多数の非推奨クラスとメソッドを削除しています。

Spring Framework GitHub WikiSpring 4.0にアップグレードするための移行ガイドも参照して下さい。

3.1 Improved Getting Started Experience

新しく開設したwebサイトspring.ioではSpringを学び始めるための"Getting Started"ガイドをすべて掲載しています。ガイドについての詳細はChapter 1, Getting Started with Springセクションを参照してください。また、このwebサイトはSpringの下でリリースされている多数の追加プロジェクトの包括的な概要も提供しています。

もしMavenユーザであれば、各Spring Frameworkリリースでパブリッシュされているbill of materials POMファイルに興味を持つかもしれません。

3.2 Removed Deprecated Packages and Methods

すべての非推奨パッケージと、多数の非推奨クラスおよびメソッドが4.0で削除されました。Springの旧バージョンからアップグレードを行う場合、旧APIを使用した非推奨の呼び出しはすべて修正済みなことを確認すべきです。

全変更点についてはAPI Differences Reportを参照してください。

注意点としては、オプションのサードパーティの依存性については2010/2011を最少にリリースされたものとします(言い換えると、Spring 4は2010もしくはそれ以降にリリースされたバージョンのみをサポートする、ということです)。特に重要なものとしては、Hibernate 3.6+, EhCache 2.1+, Quartz 1.8+, Groovy 1.8+, and Joda-Time 2.0+、となります。例外事項として、Spring 4は最新のHibernate Validator 4.3+を要求し、Jacksonサポートは2.0+です(Spring 3.2用にJackson 1.8/1.9サポートは保持するが、現在は非推奨形式となっている)。

3.3 Java 8 (as well as 6 and 7)

Spring Framework 4.0はJava 8の機能サポートを提供しています。Springのコールバックインターフェースにラムダ式メソッド参照を使用できます。java.time(JSR-310)のファーストクラスサポート、既存アノテーションのいくつかを@Repeatableとして後付(retrofitted)しています。Java 8のparameter name discovery(-parametersコンパイラフラグを使用するもの)をコンパイル時にコードのデバッグ情報を有効にする代わりに使用可能です。

SpringはJavaおよびJDKの旧バージョンとの互換性を保持しています。具体的には、Java SE 6(2010年1月にリリースされたJDK 6 update 18以上が最低限必要)とそれ以上をサポートします。とはいえ、Spring 4の新規開発プロジェクトではJava 7か8の使用を推奨します。

3.4 Java EE 6 and 7

Java EE 6以上はSpring Framework 4のベースラインを、特に関連のあるJPA 2.0とServlet 3.0について、考慮するようになっています。Google App Engineと古いアプリケーションサーバでの互換性を維持するため、Spring 4アプリケーションはServlet 2.5環境にデプロイ可能です。しかし、Servlet 3.0+を強く推奨し、また、開発環境でテストをするためのSpringのテストとモックパッケージはServlet 3.0+が必須要件です。

WebSphere 7ユーザの場合、JPA 2.0機能パックをインストールして下さい。WebLogic 10.3.4以上では、JPA 2.0 patchを一緒にインストールして下さい。このサーバ世代は両方ともSpring 4互換デプロイ環境に変化できます*1

前向きな話としては*2Spring Framework 4.0はJava EE 7 level of applicable specifications、具体的には、JMS 2.0, JTA 1.2, JPA 2.1, Bean Validation 1.1, JSR-236 Concurrency Utilities、をサポートしています。通常、このサポートは、たとえばTomcatスタンドアローン環境などで、仕様を独立して使用することに焦点を当てています。また、SpringアプリケーションをJava EE 7サーバにデプロイする場合は問題無く動作します。

JPA 2.1プロバイダであるHibernate 4.3だけはSpring Framework 4.0でサポートしています。同様なことがBean Validation 1.1プロバイダであるHibernate Validator 5.0に適用されます。両者ともSpring Framework 3.2では公式的にはサポートしていません。

3.5 Groovy Bean Definition DSL

Spring Framework 4.0の場合、Groovy DSLを使用して拡張bean設定を定義できます。考え方としてはXML bean定義と似てはいますがより簡潔なシンタックスとなっています。Groovyを使うとより簡単にブートストラップコードに埋め込みbean定義が可能となります。

def reader = new GroovyBeanDefinitionReader(myApplicationContext)
reader.beans {
    dataSource(BasicDataSource) {
        driverClassName = "org.hsqldb.jdbcDriver"
        url = "jdbc:hsqldb:mem:grailsDB"
        username = "sa"
        password = ""
        settings = [mynew:"setting"]
    }
    sessionFactory(SessionFactory) {
        dataSource = dataSource
    }
    myService(MyService) {
        nestedBean = { AnotherBean bean ->
            dataSource = dataSource
        }
    }
}

詳細についてはGroovyBeanDefinitionReaderjavadocsを参照してください。

3.6 Core Container Improvements

コアのコンテナにはいくつかの改善が施されています。

3.7 General Web Improvements

Servlet 2.5サーバの開発はオプションのままですが*3Spring Framework 4.0はServlet 3.0+環境を主にターゲットとしています。Spring MVC Test Frameworkを使用する場合はServlet 3.0互換のJARがテスト用のクラスパスに通っているか確認する必要があります。

WebSocketサポートについては後程触れますが、以下の改良をSpringのWebモジュールに加えています。

3.8 WebSocket, SockJS, and STOMP Messaging

新規のspring-websocketモジュールはWebSocketベースのクライアントとwebアプリケーションサーバ間双方向通信の完全なサポートを提供します。JSR-356と互換性のあるJava WebSocket APIで、加えて、WebSocketプロトコルをまだサポートしていないブラウザ(IE10より前など)用のSockJSベースのフォールバックオプション(言い換えればWebSocketエミュレーション)も提供します。

新規のspring-messagingモジュールは、WebSocketのサブプロトコルとしてのSTOMPサポートを、WebSocketクライアントからのSTOMPメッセージ処理とルーティング用のアノテーションプログラミングモデルに沿う形で、追加します。@ControllerにはWebSocketで接続したクライアントからのHTTPリクエストとメッセージをハンドリングする@RequestMapping@MessageMappingメソッドを定義出来ます。また、spring-messagingモジュールは、メッセージングベースアプリケーションの基盤となるMessage, MessageChannel, MessageHandlerなどSpring Integrationプロジェクトの主要な概念*4を以前から提供しています。

より詳細な情報についてはChapter 21, WebSocket Supportセクションを参照してください。

3.9 Testing Improvements

spring-testモジュール内の非推奨コードのプルーニング*5に加え、Spring Framework 4.0はユニットテストと統合テスト用の新機能をいくつか導入しています。

  • spring-testモジュールのほぼ全てのアノテーション(例えば@ContextConfiguration, @WebAppConfiguration, @ContextHierarchy, @ActiveProfiles)はカスタムcomposed annotationsを生成するためにmeta-annotationsとしての使用が可能になり、テストスイート全体の設定の重複を削減しました。
  • Active bean definition profiles*6が、ActiveProfilesResolverを実装して@ActiveProfilesresolver属性で登録という、コードを書いて作成出来るようになりました。
  • spring-coreモジュールに導入された新規のSocketUtilsクラスはlocalhostの未使用なTCPおよびUDPサーバーポートをスキャンします。テストでだけ使う機能ではないですが、ソケットを要求する統合テストの作成時、たとえばインメモリSMTPサーバ・FTPサーバ・Servletコンテナなどを開始するテスト、には有用です。
  • Spring 4.0時点でのorg.springframework.mock.webパッケージのモックはServlet 3.0 APIベースです。また、Servlet APIモックのいくつか(例えばMockHttpServletRequest, MockServletContextなど)には小規模な機能拡張と設定方法の改良がおこなわれています。

4. New Features and Enhancements in Spring Framework 4.1

4.1 JMS Improvements

Spring 4.1はJMSリスナーエンドポイントの登録を、@JmsListenerアノテーションメソッドに付与するやり方により、よりシンプルにしました。XML名前空間は新規のスタイル(jms:annotation-driven)をサポートするために拡張され、Javaコンフィグ(@EnableJms, JmsListenerContainerFactory)を使用した設定が可能です。また、JmsListenerConfigurerを使用してリスナーエンドポイントをJavaのコードで登録出来ます。

また、Spring 4.1は、4.0で導入されたspring-messagingの利点を生かすためにJMSサポートを調整しています。

  • メッセージリスナーエンドポイントは、より柔軟なシグネチャとなり、@Payload, @Header, @Headers, @SendToなどスタンダードメッセージングアノテーションの恩恵を受けられるようになりました。また、メソッド引数としてjavax.jms.Messageの代わりにMessageを使用可能です。
  • 新規のJmsMessageOperationsインタフェースが利用可能になり、Messageを使用してオペレーションライクにJmsTemplateが使用可能*7です。

Spring 4.1は以下のような雑多な改善もしています。

  • JmsTemplateにおける同期request-replyオペレーションのサポート
  • <jms:listener/>要素ごとのリスナー優先順位の指定
  • メッセージリスナーコンテナのリカバリオプションをBackOffを実装することで設定可能
  • JMS 2.0 shared consumersのサポート

4.2 Caching Improvements

Spring 4.1はSpringの既存のキャッシュ設定を使用するJCache (JSR-107)アノテーションをサポートしています。標準アノテーションを使用するために要求される変更は特にありません。*8

Spring 4.1はキャッシュの概念を著しく改善しています。

  • キャッシュはCacheResolverを使用して実行時に解決します。そのため、キャッシュ名を定義するvalue引数は必須で無くなりました。
  • オペレーションレベルカスタマイズの追加。cache resolver, cache manager, key generator
  • 新規の@CacheConfigクラスレベルアノテーションによって、任意のキャッシュ操作を有効にせずに、共通な設定をクラスレベルで共有可能です。
  • CacheErrorHandlerによるキャッシュメソッドの例外ハンドラの改善。

また、Spring 4.1ではputIfAbsentメソッドの新規追加によってCacheInterfaceに互換性の無い変更が行われました。

4.3 Web Improvements

  • 既存のResourceHttpRequestHandlerベースのリソース処理サポートは新規のResourceResolver, ResourceTransformer, ResourceUrlProviderによって拡張されました。ビルトイン実装は、versioned resource URLs(HTTPキャッシュ用)、gzippedリソースの位置指定、HTML 5 AppCacheマニフェストの生成、を提供します。詳細についてはSection 17.16.7, “Serving of Resources”を参照してください。
  • JDK 1.8のjava.util.Optional@RequestParam, @RequestHeader, @MatrixVariableコントローラーメソッドの引数に取れます。
  • ListenableFutureを返す既存サービス(かAsyncRestTemplateの呼び出し)で戻り値としてDeferredResultではなくListenableFutureをサポートします。
  • 内部依存性に配慮した順序で@ModelAttributeメソッドが呼び出されます*9SPR-6299を参照してください。
  • 同一POJOだが異なる詳細レベル(例えば要約と詳細ページ)をシリアライズする@ResponseBodyResponseEntityコントローラーメソッドにおいてJachsonの@JsonViewを直接サポートします。また、特別なキーの元でモデル属性としてシリアライズビュータイプを追加することでViewベースレンダリングもサポートします*10。詳細はthe section called “Jackson Serialization View Support”を参照してください。
  • JSONPはJacksonでサポートします。the section called “Jackson JSONP Support”を参照してください。
  • 新規のライフサイクルオプションとして@ResponseBodyResponseEntityメソッドインターセプトを、コントローラーメソッドが制御を返す直後とレスポンスが書き込まれる直前に、利用可能です。使用するにはResponseBodyAdviceを実装する@ControllerAdvicebeanを宣言します。@JsonView組み込みサポートとJSONPはこれを利用しています。Section 17.4.1, “Intercepting requests with a HandlerInterceptor”を参照してください。
  • 新しく三つのHttpMessageConverterオプションを設けています。
    • Gson - Jacksonの軽量フットプリント。Spring Androidで既に使用中です。
    • Google Protocol Buffers - エンタープライズの内部サービス通信データプロトコルとして効率的で効果的で、ブラウザにXMLJSONとしてエクスポート可能です。
    • jackson-dataformat-xml拡張を介したJacksonベースのXMLシリアライズ@EnableWebMvcもしくは<mvc:annotation-driven/>を使用する場合、もしクラスパスにjackson-dataformat-xmlがある場合はJAXB2の代わりにこちらをデフォルトとして使用します。
  • JSPなどのViewは名前でコントローラーへのマッピングを参照してコントローラーへのリンクを構築します。すべての@RequestMappingはデフォルトの名前を持ちます。たとえば、handleFooメソッドを持つFooControllerは"FC#handleFoo"という名前になります。この命名規則は差し替え可能です。@RequestMappingのname属性で明示的に名前を設定することも可能です。Spring JSPタグライブラリの新しいmvcUrl関数によってJSPページで名前付けを簡単に出来ます。Section 17.7.2, “Building URIs to Controllers and methods from views”を参照してください。
  • ResponseEntityはサーバーサイドでレスポンスを返すようコントローラーメソッドが指示するためのbuilderスタイルのAPIを提供します。
  • RequestEntityはHTTPリクエストを出すようクライアントサイドのRESTコードが指示するためのbuilderスタイルのAPIを提供する新しい型です。
  • MVC Java設定とXML名前空間
    • コンテンツネゴシエーションのサポートを含むようViewリゾルバを設定可能です。詳細はSection 17.16.6, “View Resolvers”を参照してください。
    • Viewコントローラでリダイレクトの組み込みサポートとレスポンスステータスの設定が可能です。アプリケーションでリダイレクトURLを設定可能で、ビューで404レスポンスを表示し、"no content"レスポンスを送信する、などを行えます。使用例についてはコチラにあります
    • 頻繁に使用されるパスマッチングのカスタマイズが取り込まれました。Section 17.16.9, “Path Matching”を参照してください。
  • Groovy markup templateサポート(Groovy 2.3ベース)。GroovyMarkupConfigurerと各ViewResolverと‘View’の実装を参照してください。

4.4 WebSocket STOMP Messaging Improvements

  • SockJS (Java)クライアントサイドサポート。詳細はSockJsClientと同パッケージのクラスを参照してください。
  • STOMPクライアントがサブスクライブ・アンサブスクライブするとき、新しいアプリケーションコンテキストイベントSessionSubscribeEventSessionUnsubscribeEventをパブリッシュします。
  • 新しい"websocket"スコープ。Section 21.4.13, “WebSocket Scope”を参照してください。
  • @SendToUserはシングルセッションのみを対象とし、認証済みユーザを要求しません。
  • @MessageMappingメソッドはパスパラメータとしてスラッシュ"/"の代わりにドット"."を使用可能です。SPR-11660を参照してください。
  • STOMP/WebSocketの監視情報を収集してログ出力します。Section 21.4.15, “Runtime Monitoring”を参照してください。
  • ログ出力に対するかなりの最適化と改良で読みやすさはそのままにDEBUレベルはコンパクトになると思われます。
  • temporary message mutabilityサポートと自動メッセージIDおよびタイムスタンプ生成の回避を含むメッセージ生成の最適化。詳細はMessageHeaderAccessorjavadocを参照してください。
  • STOMP/WebSocket接続はWebSocketセッション確立後60秒間何も活動が無いと切断します。SPR-11884を参照してください。

4.5 Testing Improvements

*1:This turns both of those server generations into Spring 4 compatible deployment environments.が原文。turn .. into .. のニュアンスが良く分からないんで『変化できます』は誤訳かもしれない

*2:On a more forward-looking noteが原文。互換性がうんぬんという泥臭い話が続いたので、ポジティブな単語で切り返すのが良いかなぁと思い、こういう訳にした。

*3:Deployment to Servlet 2.5 servers remains an optionが原文。何のこと言ってるのかよく分からなかった

*4:key abstractionsが原文。ぐぐるhttp://epf.eclipse.org/wikis/openup/core.tech.common.extend_supp/guidances/concepts/key_abstractions_1474DBF2.html とかが出てくるが、そのシステムにおける主要なコンセプトを示す概念、くらいなニュアンス

*5:https://blogs.oracle.com/wlc/entry/javaee_c114

*6:Spring良く知らんけどそういう機能があるらしい

*7:permits JmsTemplate like operations が原文。operationの対訳が謎。JmsMessageOperationsとかのjavadocを見る限りでは「メソッド」なのかな?「操作」でもよかったかなぁ

*8:no changes are required to use the standard annotationsが原文。JCache使うのになんも変更しなくていいよ、くらいの意味合いと思われるが、こういう文訳すの苦手。

*9:@ModelAttribute methods are now invoked in an order that respects inter-dependenciesが原文。SPR-6299が何か知らないので良く分からん

*10:This is also supported with View-based rendering by adding the serialization view type as a model attribute under a special keyが原文。これが指してる技術使ったことないので訳も意味不明になってる