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 WikiのSpring 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。
前向きな話としては*2、Spring 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 } } }
詳細についてはGroovyBeanDefinitionReader
のjavadocsを参照してください。
3.6 Core Container Improvements
コアのコンテナにはいくつかの改善が施されています。
- SpringはBean注入時にgeneric types as a form of qualifierを処理します。たとえば、Spring Data
Repository
を使用する場合、特定の実装を@Autowired Repository<Customer> customerRepository
のようにして簡単に注入可能です。 - Springのメタアノテーションサポートを使用する場合、ソースアノテーションから特定の属性を露出するカスタムアノテーションを開発可能です。
- Beanがリストと配列にautowiredされる場合は順序付けが可能です。
@Order
アノテーションとOrdered
インタフェースがそれをサポートします。 @Bean
定義及び@Lazy
アノテーションを注入時に使用可能です。- Javaベースの設定を使用する開発者用に
@Description
アノテーションが導入されました。 - 条件付きフィルタbean(conditionally filtering beans)の汎用モデルが
@Conditional
アノテーションを介する形で追加されました。これは@Profile
サポートに似ていますが、プログラム的に開発するユーザ定義が可能となる点が異なります。 - CGLIB-based proxy classesはデフォルトコンストラクタを要求しなくなりました。これはobjenesisライブラリを介して提供しており、インライン化してSpring Frameworkの一部としています。このライブラリ下では、プロキシインスタンスの呼び出しにはコンストラクタが必要ありません。
- 例えば
LocaleContext
などフレームワーク全体にまたがってmanaged time zoneをサポートしています。
3.7 General Web Improvements
Servlet 2.5サーバの開発はオプションのままですが*3、Spring Framework 4.0はServlet 3.0+環境を主にターゲットとしています。Spring MVC Test Frameworkを使用する場合はServlet 3.0互換のJARがテスト用のクラスパスに通っているか確認する必要があります。
WebSocketサポートについては後程触れますが、以下の改良をSpringのWebモジュールに加えています。
- Spring MVCアプリケーションで新しい@RestControllerアノテーションを使用可能で、
@RequestMapping
ごとに@ResponseBody
を追加しなくても良くなりました。 - RESTクライアント開発でノンブロッキングな非同期サポートを可能とする
AsyncRestTemplate
クラスを追加しました。 - SpringはSpring MVCアプリケーション開発で包括的なタイムゾーンサポートを提供します。
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
を実装して@ActiveProfiles
のresolver
属性で登録という、コードを書いて作成出来るようになりました。 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
メソッドが呼び出されます*9。SPR-6299を参照してください。 - 同一POJOだが異なる詳細レベル(例えば要約と詳細ページ)をシリアライズする
@ResponseBody
とResponseEntity
コントローラーメソッドにおいてJachsonの@JsonView
を直接サポートします。また、特別なキーの元でモデル属性としてシリアライズビュータイプを追加することでViewベースレンダリングもサポートします*10。詳細はthe section called “Jackson Serialization View Support”を参照してください。 - JSONPはJacksonでサポートします。the section called “Jackson JSONP Support”を参照してください。
- 新規のライフサイクルオプションとして
@ResponseBody
とResponseEntity
メソッドのインターセプトを、コントローラーメソッドが制御を返す直後とレスポンスが書き込まれる直前に、利用可能です。使用するにはResponseBodyAdvice
を実装する@ControllerAdvice
beanを宣言します。@JsonView
組み込みサポートとJSONPはこれを利用しています。Section 17.4.1, “Intercepting requests with a HandlerInterceptor”を参照してください。 - 新しく三つの
HttpMessageConverter
オプションを設けています。- Gson - Jacksonの軽量フットプリント。Spring Androidで既に使用中です。
- Google Protocol Buffers - エンタープライズの内部サービス通信データプロトコルとして効率的で効果的で、ブラウザにXMLとJSONとしてエクスポート可能です。
- 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クライアントがサブスクライブ・アンサブスクライブするとき、新しいアプリケーションコンテキストイベント
SessionSubscribeEvent
とSessionUnsubscribeEvent
をパブリッシュします。 - 新しい"websocket"スコープ。Section 21.4.13, “WebSocket Scope”を参照してください。
@SendToUser
はシングルセッションのみを対象とし、認証済みユーザを要求しません。@MessageMapping
のメソッドはパスパラメータとしてスラッシュ"/"の代わりにドット"."を使用可能です。SPR-11660を参照してください。- STOMP/WebSocketの監視情報を収集してログ出力します。Section 21.4.15, “Runtime Monitoring”を参照してください。
- ログ出力に対するかなりの最適化と改良で読みやすさはそのままにDEBUレベルはコンパクトになると思われます。
- temporary message mutabilityサポートと自動メッセージIDおよびタイムスタンプ生成の回避を含むメッセージ生成の最適化。詳細は
MessageHeaderAccessor
のjavadocを参照してください。 - STOMP/WebSocket接続はWebSocketセッション確立後60秒間何も活動が無いと切断します。SPR-11884を参照してください。
4.5 Testing Improvements
- TestContextフレームワークの統合テスト用にロードする
ApplicationContext
の設定にGroovyスクリプトを使用できます。 - 新しい
TestTransaction
APIを用いてトランザクションの開始と終了をテストメソッド内で制御可能なTest-managed transactionsを使用できます。 - SQLスクリプト実行をクラスごとあるいはメソッドごとに新しい
@Sql
と@SqlConfig
アノテーションを用いて宣言的な設定が可能です。- 詳細はthe section called “Executing SQL scripts”を参照してください。
- 自動的にシステムおよびアプリケーションプロパティをオーバーライドするテストプロパティを新しい
@TestPropertySource
アノテーションで設定可能です。 - automatically discoverのデフォルト
TestExecutionListener
を使用可能です。 - デフォルトリスナーの automatically mergeには
TestExecutionListeners
を拡張します。- 詳細はthe section called “Merging TestExecutionListeners”を参照してください。
- TestContextフレームワークを使用したトランザクションのテストのドキュメントに解説とサンプルを追加しました。
- 詳細はthe section called “Transaction management”を参照してください。
MockServletContext
,MockHttpServletRequest
とその他のServlet APIモックに各種改善を行いました。AssertThrows
をException
ではなくThrowable
にリファクタリングしました。- Spring MVC Testでは、XMLUnitでXMLに対して行うような、JSONPathを使用する拡張オプションとしてJSONレスポンスをJSON Assertでアサート可能です。
MockMvcBuilder
recipesをMockMvcConfigurer
の助けを借りて生成可能です。このクラスはSpring Securityの適用を簡易化するために追加したものですが、任意のサードパーティーフレームワークやプロジェクト内のライブラリの共通なセットアップをカプセル化するのにも使用可能です。MockRestServiceServer
はクライアントサイドのテスト用にAsyncRestTemplate
をサポートします。
*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が原文。これが指してる技術使ったことないので訳も意味不明になってる