Spring Bootチームは先日、Spring Boot 2.2の最初のマイルストーンリリースとなるv2.2.0 M1をリリースした。パフォーマンスやメモリに関する改善の他、Kubernetesの検出、サードパーティのライブラリ更新などが行われている。さらに今回のリリースでは,140を超える問題が解決されている。
今回のリリースから、JMXがデフォルトで無効になった。SpringチームのBrian Clozel氏が次のように説明する。
"この機能が広く使用されているとは思われませんし、大量のリソースを必要とすることから、2.2ラインではデフォルト設定の見直しを行っています。"
その他にも,起動時のパフォーマンス向上策として、新機能として提供されるグローバル遅延初期化、冗長なJPAスキャンの排除、大規模な設定ファイルの高速バインディング、Beanの生成とインジェクションに関する効率向上などが含まれている。
グローバル遅延初期化(spring.main.lazy.initializationで使用可能)は,2.2で導入された注目すべき新機能で、すべてのBean生成を使用時まで遅らせることによって起動時間を大幅に短縮するものだ。ただし、これにはトレードオフが伴う。HTTPリソースに対する最初の要求時に必要なBeanが初期化されるため,待ち時間が長くなる可能性があるのだ。2回目以降のリクエストについては,もちろん影響はない。もうひとつ,潜在的にはよりリスクの大きいトレードオフとして,通常はスタートアップ時に発生するようなBean関連の書き込みや依存関係に関するエラーが,後になって発生する可能性がある。
他のJPAスキャナ(Hibernateなど)を無効にしたことで,起動時のパフォーマンスも向上している。Spring Bootはすでに独自のJPAスキャンを提供しているため、その他のスキャナはすべて冗長であり、アプリケーションの起動に要する時間を長くするだけの存在なのだ。
大規模な設定ファイルのバインディングは起動時に実行しなければならないプロセスだが,これが非常に速くなった。これはユーザから非常に歓迎されている変更のようだ。あるRedditユーザは,従来のバージョンでは,"スタートアップ時のYAMLファイル(ざっと5,000プロパティ)をロードするのに,私のi7で10秒は必要だ",と述べている。
Bean生成とインジェクションはスタートアップ時間とメモリ使用量に直接影響するので,今回のリリースでは,生成およびインジェクションを行うBeanを,これまでよりも賢く選択できるようになった。特にSpring Bootのアクチュエータエンドポイントに関連するBeanは、アクチュエータが有効で,かつ,(HTTP経由などで)公開されている場合にのみ生成されるようになった。自動設定でのBeanの使用も改善されている。あるBeanが自動設定の一部でのみ使用されているにも関わらず,常にコンストラクタにインジェクトされている場合,使用しない他の部分にとっては,そのBeanの生成とインジェクションは無用な処理だということになる。特に自動構成では,依存関係のBeanの使用方法に関して,これまでより正確に把握できるようになった。
@ConditionalOnCloudPlatformアノテーションがアップデートされて,アプリケーションがKubernetesプラットフォーム上で実行されていることを検出できるようになった。これによってユーザや他のフレームワークが、Kubernetesにのみ適用される機能や実装を条件付きで設定することが,簡単にできるようになった。
依存関係に関しては、AssertJ、Mockito、Kafka、Spring HATEOAS、Spring Dataなどが、今回アップグレードされた注目すべきサードパーティ製ライブラリである。その他の依存関係も,いくつかアップグレードされている。
Java EEの依存関係にも変更があった。すべてのJava EE依存関係が,等価なJakarta EE依存関係に置き換えられたのだ。これはJava EEから,Eclipse Foundationの下での新たなEEの名称であるJakarta EEへという,より大きなマイグレーションの一部である。
マイルストンリリースは、Spring Bootリリースの開発サイクル上の重要なポイントを示すもので,そのリリースが強固なものであって,主なバグや問題の大部分が解決されていることを表している。通常は最終リリースが近づいていて,残った問題の微調整や仕上げが主な目的であることを予見させるものだ。2.0系のこれまでのリリースでは,4~7回のマイルストンリリースが間に挟まれていた。