今回から数回(全7回を予定)にわけて、2017/7月リリース予定で2017/5/8にRC1がリリースされたSpring Framework 5.0の主な変更点(新機能や改善点など)を紹介していきたいと思います。
本エントリーは「New Features and Enhancements in Spring Framework 5.0」で紹介されている内容を、サンプルコードなどを交えて具体的に説明していく予定です。(逆にいうと、「New Features and Enhancements in Spring Framework 5.0」にのっていない変更点は紹介しないので、あしからず・・・
)
なお、初回である今回は簡単な概要説明(日本語化+α)にとどめておき、次回から具体的な説明を行っていきます。
トピック
本エントリーでは、Spring Framework 5.0の主な変更点を以下の8つのトピックに分けて紹介していきます。
- Change JDK 8+ and Java EE 7+ Baseline
- Removed Packages, Classes and Methods
- General Core
- DI Container
- WebMVC
- Test
- WebFlux (新機能)
- Kotlin support (新機能)
シリーズ
- 第1回: Spring Framework 5.0 主な変更点の概要
- 第2回: Spring Framework 5.0 コア機能の主な変更点
- 第3回: Spring Framework 5.0 DIコンテナ関連の主な変更点
- 第4回: Spring Framework 5.0 WebMVC関連の主な変更点
- 第5回: Spring Framework 5.0 Test関連の主な変更点
- 第6回: Spring Framework 5.0 WebFlux(Reactive Web Framework) (予定)
- 第7回: Spring Framework 5.0 Kotlinサポート (予定)
JDK 8+ and Java EE 7+ Baseline
Spring Framework 5.0では、Spring Framework 4系ではサポートしていたJDK 6と7のサポートを終了し、JDK 8以上が必須になります。これはクラスファイルのバイトコードのターゲットバージョンの話だけではなく、Springのソースコード自体がJDK 8からサポートされた機能(ラムダ式、Stream API, Optional, Data and Time APIなど)にがっつり依存するコードになっています(既存コードもリファクタリングされています)。
さらに、サポートするJava EEの仕様バージョンがJava EE 7(Servlet 3.1, JMS 2.0, JPA 2.1, Bean Validation 1.1など)に更新され、部分的にJava EE 8(Servlet 4.0, Bean Validation 2.0, JSON Binding APIなど)へのサポートも行われています。
Note:
Java SE 8やJava EE 7にバージョンアップできない場合は、Spring Framework 4.3を利用しましょう。Spring Framework 4.3は2019年までサポートされる予定です。情報が少し古い(4.3.0.RELEASE時点)ですが、「Spring Framework 4.3の主な変更点」も同じ観点でまとめてあります。
Removed Packages, Classes and Methods
Spring Framework 5.0では、Spring Framework 4系で非推奨になっているクラスやメソッドの多くが物理的に削除されます。たとえば・・・
-
[SPR-13229] Tiles 2.xとの連携クラス
-
[SPR-13827] Hibernate ORM 3.xとの連携クラス
-
[SPR-13795] Velocityとの連携クラス
-
[SPR-13796] XMLBeansとの連携クラス
-
[SPR-14485]
org.springframework.mock.staticmockパッケージのクラス(AnnotationDrivenStaticEntityMockingControlなど)
などです。また、Spring Framework 5.0でサポートからはずれるライブラリや機能も数多くあり、たとえば・・・
-
[SPR-13827] Hibernate ORM 4.xとの連携クラス
-
[SPR-13294] JasperReportsとの連携クラス
-
[SPR-14130] JDO(Java Data Objects)との連携クラス
-
[SPR-13797] GuavaのCache機能との連携クラス
-
[SPR-14129]
spring-webmvc-portletモジュール -
[SPR-15154]
org.springframework.beans.factory.accessパッケージのクラス (BeanFactoryLocatorなど) -
[SPR-14670]
org.springframework.jdbc.support.nativejdbcパッケージのクラス (NativeJdbcExtractorなど)
などがあげられます。
Note:
これらのクラス、ライブラリ、機能を引き続き使用したい場合は、Spring Framework 4.3を利用しましょう。Spring Framework 4.3は2019年までサポートされる予定です。情報が少し古い(4.3.0.RELEASE時点)ですが、「Spring Framework 4.3の主な変更点」も同じ観点でまとめてあります。
General Core
Spring Framework 5.0では、アプリケーションの種類に依存しない汎用的な機能(=コア機能)に対して以下のような変更が行われています。 [詳細へ
]
| 項番 | 変更内容 |
|---|---|
| 1 | JDK 8でサポートされた仕組みを利用してメソッドパラメータに効率的にアクセスできるようになります。[詳細へ Note: 内部実装の話なので外部仕様は変わりません。 |
| 2 | いくつかのインタフェースにて、JDK 8でサポートされたデフォルトメソッドが実装されるようになります。[詳細へ Note: それらのインタフェースの実装クラス(拡張クラス)を作成する際には、必要なメソッドだけ実装すればよくなるので、「空実装を提供するAdapterクラスの作成」や「無駄に空実装を行う」といった対応が不要になります。 |
| 3 | JDK 7でサポートされたStandardCharsetsを使うようになります。[詳細へNote: 内部実装の話なので外部仕様は変わりません。 |
| 4 | JDK 9で非推奨になる予定のClass#newInstance()の代わりにConstructor#newInstance()を呼び出してインスタンスを生成するようになります。[詳細へNote: 内部実装の話なので外部仕様は変わりません。 |
| 5 |
spring-jclモジュールが追加され、Commons LoggingのAPIを介してLog4j 2.x, SLF4J, JUL(java.util.logging)経由でログを出力できるようになります。[詳細へNote: Spring Framework 4.3までは必要だったログブリッジ用のライブラリは不要になります。 |
| 6 | リソースを抽象化するためのインタフェース(Resource)にisFile()メソッドが追加され、リソースがファイルシステム上に存在するか判定できるようになります。[詳細へ |
| 7 | リソースを抽象化するためのインタフェース(Resource)にreadableChannel()メソッドが追加され、ReadableByteChannel(New I/O)経由でリソースのデータを読み込むことができるようになります。[詳細へ |
DI Container
Spring Framework 5.0では、DIコンテナに対して以下のような変更が行われています。 [詳細へ
]
| 項番 | 変更内容 |
|---|---|
| 1 | アプリケーション実行時にクラスパスからコンポーネントをスキャンしてDIコンテナにBean登録する機能(@ComponentScan)の代替(アプリケーション起動時間の短縮と一定化目的)として、コンパイル時にBean登録するコンポーネント候補のインデックスを作成しておく仕組みが追加されます。 [詳細へ |
| 2 | オートワイヤリングによるインジェクションが任意(オプション)であることを示す際に、自作または3rdパーティのライブラリから提供されている@Nullableを指定することができるようになります。[詳細へNote: アノテーション名が "Nullable"であるか否かで判断しています。 |
| 3 |
GenericApplicationContextとAnnotationConfigApplicationContextに、関数型インタフェース(Supplier)を利用したBean登録メソッド(registerBean)とBean定義をカスタマイズするためのインタフェース(BeanDefinitionCustomizer)が追加されます。 [詳細へ |
| 4 | インタフェースを実装したクラスに対して「CGLIBのProxy」を使用してAOPを適用する際(proxyTargetClass=true指定した際)に、インタフェースのメソッドに指定したアノテーション(@Transactional, @Cacheable, @Syncなど)が読み取られるようになります。 [詳細へ |
| 5 | XMLでBean定義する際に指定するxsdファイルの世代管理(過去バージョン用のxsdファイルの提供)が廃止され、該当バージョン向けのxsdファイルのみJARファイルに格納されるようになります。 [詳細へ Note: XMLファイル内でバージョン付きのxsdファイルの指定は引き続きサポートされますが、XMLファイル解析時には常に同じxsdファイルが利用されます。 |
WebMVC
Spring Framework 5.0では、WEB機能に対して以下のような変更が行われています。 [詳細へ
]
| 項番 | 変更内容 |
|---|---|
| 1 | Spring Framework提供のサーブレットフィルタがServlet 3.1のAPI仕様準拠の実装になります。(実はどう準拠したのかわかってない・・・ |
| 2 | Spring MVCのHandlerメソッドの引数として、Java EE 8の構成要素であるServlet 4.0で追加されるPushBuilder(HTTP/2のServer Pushを行うためのAPI)を受け取れるようになります。 [詳細へ |
| 3 | Servlet 3.0でサポートされたファイルアップロード機能のサイズ超過エラーが発生した際に、MaxUploadSizeExceededException(MultipartExceptionのサブ例外)がスローされるようになります。 [詳細へNote: ただし、エラーメッセージに特定の単語( "size"と"exceed")が含まれているか否かで判定しているため、アプリケーションサーバの実装によっては従来どおりMultipartExceptionがスローされる可能性があるという点は意識しておいた方がよいでしょう。 |
| 4 | 統一的なメディアタイプ解決の仕組み(MediaTypeFactoryクラス)が追加されます。 [詳細へNote: この対応に伴いJAF(JavaBeans Activation framework)依存のコードが排除される。 |
| 5 | イミュータブルオブジェクトへのデータバインディングがサポートされます。 [詳細へ |
| 6 | Jackson 2.9がサポート対象になります。 [詳細へ |
| 7 | Java EE 8の構成要素であるJSON Bindingがサポート対象になります。 Note: これはJacksonおよびGSONの代替として使用することができます。 [詳細へ |
| 8 | Google Protobuf 3.xがサポート対象になります。 [詳細へ |
| 9 | Reactive Programing Model(後述するSpring WebFlux)のサポートに伴い、Reactor 3.1のクラス(Flux, Mono)、RxJava 1.3と2.1のクラス(Observable, Sigle, Flowableなど)をHandlerメソッドの返り値として扱うことができるようになります。 [詳細へ |
| 10 |
AntPathMatcherの代替として、ParsingPathMatcherが追加されます。 [詳細へNote: Spring WebFlux関連のコンポーネントでは、 ParsingPathMatcherがデフォルトで使用されます。 |
| 11 |
@ExceptionHandlerメソッドの引数として、RedirectAttributesを受け取れるようになります。(=RedirectAttributesを介してリダイレクト先とデータを連携することができるようになります) [詳細へ |
| 12 |
ResponseStatusExceptionが追加され、任意のステータスコードとリーズンフレーズを指定して例外を生成・スローすることで、HTTPステータスを制御できるようになります。 [詳細へNote: ResponseStatusExceptionはSpring WebFlux向けに作成したみたいですが、Spring MVCでも使えるように対応されています。 |
| 13 |
ScriptTemplateView(JSR-223のスクリプトエンジンを使用したView実装)にて、「メッセージの国際化」および「テンプレートのフラグメント化」を実現するために必要となるオブジェクト(Locale,MessageSourceなど)がテンプレートエンジン側に引き渡されるようになります。 [詳細へNote: 「国際化」や「テンプレートをフラグメント化」するための実装自体はSpringからは提供されないので、Springのテストケースなどを参考に開発者が実装する必要があります。 |
Test
Spring Framework 5.0では、テスト機能に対して以下のような変更が行われています。 [詳細へ
]
| 項番 | 変更内容 |
|---|---|
| 1 | Spring TestContext Framework(TCF)をJUnit 5 Jupiter上で利用できるようになります。 [詳細へ Note: SpringExtensionクラス、@SpringJUnitConfigアノテーション、@SpringJUnitWebConfigアノテーション、@EnabledIfアノテーション、@DisabledIfアノテーションが追加されます。 |
| 2 | Spring TestContext Frameworkを使用したテストを平行実行できるようになります。 [詳細へ |
| 3 |
TestExecutionListenerインタフェースに、テストの実行直前と実行直後に呼び出されるコールバックメソッド(beforeTestExecutionとafterTestExecution)が追加されます。 [詳細へ |
| 4 |
MockHttpServletRequestにリクエストBODYにアクセスするためのメソッド(getContentAsByteArrayとgetContentAsString)が追加されます。 [詳細へ |
| 5 |
MockMvc使用時のテスト結果をコンソールまたはログに出力する際(MockMvcResultHandlersのprintまたはlogメソッドを使用する際)に、リクエストBODYも出力されるようになります。 [詳細へ |
| 6 |
MockMvc使用時の「リダイレクト先URL」と「フォワード先URL」を検証する際に、期待値にURIテンプレートを指定できるようになります。 [詳細へ |
| 7 | XMLの検証をサポートするライブラリであるXMLUnitのサポートバージョンが2.3になります。 [詳細へ |
WebFlux
Spring Framework 5.0では、Reactive Programing Modelによるノンブロッキングなアプリケーションを開発するためのWebフレームワーク(Spring WebFlux)が追加され、ランタイム環境として「Servlet 3.1+準拠のアプリケーションサーバー」「Netty(Reactor Netty)」「Undertow」がサポートされます。
Reactive Programming ModelはSpring Framework 5で導入された新機能なので、「Spring Frameworkのリファレンスドキュメント-WebFlux framework-」を一読するのがよいでしょう(→ただし・・・一部ドキュメントの更新が追いついていない部分があるので、がっつり読むのは正式リリース後の方がよいかもしれません
)。
Note:
あと・・・おそらく日本で一番Spring WebFluxに詳しい
@makingさんブログ(BLOG.IK.AM)の「はじめてのSpring WebFlux」シリーズは必読です!!
- 「はじめてのSpring WebFlux (その1 - Spring WebFluxを試す)」
- 「はじめてのSpring WebFlux (その1.5 - Spring Bootを使わずSpring WebFluxをマニュアルでBootstrap)」
「その2」「その3」も予告されているので、定期的にウォッチしておくことをお勧めします。
具体的には以下のような対応が行われています。
| 項番 | 対応内容 |
|---|---|
| 1 | Reactive Programing Model向けのフレームワーク(Spring WebMVCの代替)としてSpring WebFluxが追加されます。Spring WebMVCは(伝統的な)1リクエストに対して1スレッドを割り当てるスレッドプール実行モデル向けのフレームワークなのに対して、WebFluxは非同期実行とノンブロッキングの仕組みを活用したイベントループ実行モデル向けのフレームワークになります。 Note: Spring MVCでもServlet 3.0からサポートされた非同期実行の仕組みを利用してリクエストとレスポンスを別スレッドで扱うことはできますが、ノンブロッキングのサポートはありません。 |
| 2 | Reactive Programing Modelの基盤機能として、
|
| 3 | Reactive Programing ModelのWeb用基盤機能として、
|
| 4 | Spring MVCと同じようにアノテーションベースの(@Controllerなどを使用した)プログラミングモデルがサポートされており、HandlerメソッドのメソッドシグネチャとしてReactiveライブラリ(Reactor, RxJava, etc..)提供のクラスを指定することができます。 |
| 5 | アノテーションベースのプログラミングモデルの代替として、「関数型のWebフレームワーク(エンドポイントとHandlerメソッドのマッピング定義をJavaメソッドで行うスタイル=RouterFunction)」がサポートされます。 |
| 6 | Reactive Programing Model向け(非同期・ノンブロッキング向け)のHTTPクライアント(WebClient)が新たに追加されます。Note: 非同期通信用のHTTPクライアントとして AsyncRestTemplateが提供されていますが、ノンブロッキングおよびFluent APIをサポートしているWebClientに比べてAsyncRestTemplateの優位性がほとんどないため、Spring Framework 5.0からAsyncRestTemplateは非推奨APIになります。 |
Kotlin support
Spring Framework 5.0では、SpringアプリケーションをKotlinを使って開発しやすくするための対応が行われています。詳細は、Kotlin対応を行っているのSÉBASTIEN DELEUZEさんのブログ「Introducing Kotlin support in Spring Framework 5.0」と@makingさんのブログ「Spring Framework 5のKotlinサポート」をみるのがよいです。
Note:
Spring Framework 5.0がサポートするKotlinのバージョンは1.1以上になります。
具体的には以下のような対応が行われています。
| 項番 | 対応内容 |
|---|---|
| 1 | 「Kotlin Extensions」の仕組みを活用し、Spring Frameworkアプリケーションを"idiomatic Kotlin code"(Kotlinらしいコード)で実装できるようになります。 Note: RestTemplateOperationsやJdbcOperationsなどを筆頭に、いくつかのインタフェースやクラスに対してこの対応が行われいます。 |
| 2 | 「Reified type parameters」の仕組みを活用し、RestTemplateやWebFlux向けのAPIなどで符号化・復号化対象のクラスを、メソッドの引数に明示的に指定しなくても済みます。 |
| 3 | Spring提供のメソッド中にはJavaのClassオブジェクトを引数にとるメソッドがいくつかありますが、それらのメソッドにKClassオブジェクトを渡せるようになってなっています。 |
| 4 |
@RequestParamや@RequestHeaderなど、及び@Autowired/@Injectを使用してオブジェクト(リクエストパラメータやBean)をインジェクションする際に、そのオブジェクトが必須であるかを示すためにKotlinの「Null Safety」の仕組みが使えます。(required=falseの代替方法) |
| 5 | 関数型インタフェースを利用したBean登録で、Kotlin用のDSL(Domain Specific Language)が用意されています。 |
| 6 | Spring WebFlux提供のRouterFunctionのコンフィギュレーションで、Kotlin用のDSLが用意されています。 |
| 7 |
ScriptTemplateView(JSR-223のスクリプトエンジンを使用したView実装)にて、Kotlinのスクリプトが使えるようになります。Note: Spring MVCおよびSpring WebFlux両方でサポートされています。 |
| 8 |
ModelとModelMapに対して、コレクション(Map)と同じようにオブジェクトを追加することができます。(例:model["todo"] = todo
|
まとめ
以上が「New Features and Enhancements in Spring Framework 5.0」で紹介されている変更点になります。(ちょっと解釈が正しいか自信がもてないところもあるので・・・間違えがあったらコメントください!!)
おそらく文章だけだと伝わらないことも多々あると思う(「ふ〜ん」って感じだと思う)ので、次回からはSpring Framewrok 4.3との比較やサンプルコードなどを交えながら、もうすこし詳しく変更内容を紹介していく予定です。
Note:
なお、Spring Framework 5.0の全ての変更点については、Spring JIRAのIssueをご覧ください。
参考サイト
- 「New Features and Enhancements in Spring Framework 5.0」
- 「Spring Frameworkのリファレンスドキュメント-WebFlux framework-」
- 「Introducing Kotlin support in Spring Framework 5.0」
- 「Spring Framework 5のKotlinサポート」
- 「はじめてのSpring WebFlux (その1 - Spring WebFluxを試す)」
- 「はじめてのSpring WebFlux (その1.5 - Spring Bootを使わずSpring WebFluxをマニュアルでBootstrap)」