Object Computing, Inc. は、デフォルトのリアクティブストリームの実装の削除、アノテーションの継承の変更、HTTPコンパイル時検証を特徴とする Micronaut3.0 をリリースした。このリリースは、フレームワークをより直感的にし、将来の要件に適応できるようにして、過去の設計上の欠陥を解決するための作業の集大成だった。
Micronaut は、モジュールで容易にテスト可能なマイクロサービスとサーバレスアプリケーションを構築するための JVM ベースのフルスタック開発フレームワークであり、アプリケーションの起動時間とメモリ消費を再考することを主要なミッションと定義されている。「Micronaut の方法」は、アプリケーションの起動時間とメモリ消費量がコードベースのサイズに制限されないという事実に依存しているため、前述のように「起動時間の大幅な飛躍、高速スループット、最小のメモリフットプリント」が実現すると彼らのウェブサイトで述べられている。
以前のリリースには、推移的な依存関係として RxJava2 と、フレームワークに多くの機能を実装するために使用されるデフォルトのリアクティブストリームが含まれていた。RxJava3 のリリースは、Project Reactor へのアップグレードまたは切り替えという決定を下すのに適切な時期だった。Micronaut チームは、リアクティブフローで状態を維持し、コミュニティで広く採用される機能を備えている、後者を選択した。チームはまた、現在 RxJava2 を使用しているプロジェクトを Project Reactor に切り替えることを推奨している。これにより、ランタイムクラスパス上のクラスが少なくなり、コンテキストの伝播とリアクティブ型変換に関する潜在的な問題が少なくなる。
このリリースでは、開発者がアノテーションを操作する方法が変更されている。これまで、アノテーションは親インターフェースまたはクラスから継承されていた。ただし、バージョン 3.0以降は、@Inherited
のアノテーションが付けられたすべてのアノテーションが継承される。特に、この変更に伴い、bean スコープや around/introduction advice に関連したアノテーションは継承されなくなる。
HTTP関連コンポーネントのライセンス変更または移動のいずれかによって、いくつかのアノテーションの修飾名が変更された。最初のケースは、javax 名前空間のライセンスの問題
が javax.annotations
の下のすべてのアノテーションに影響した。つまり、このバージョンでは、jakarta.annotation.PreDestroy
と jakarta.annotation.PostConstruct
が代替手段に推奨される。また、jakarta.inject のアノテーションに置き換えられた javax.inject
のアノテーションも影響を受ける。したがって、javax.inject.Provider
の現在の使用法で、推奨される代替手段は io.micronaut.context.BeanProvider
だ。2番目のケースは、コンパイル時のHTTP関連コンポーネントが新しいモジュール io.micronaut:micronaut-http-validation
に移されたことだ。コンパイル時に検証されるクラスを引き続き使用するには、この依存関係をアノテーションプロセッサのクラスパスに追加する必要がある。
Micronaut の制御の反転 (IoC) メカニズムは、粒度と制御の改善がある。開発者は、ジェネリック引数によって型の注入を修飾できるようになった。型引数を使用するクラスは、引数の型でそれらのジェネリックを指定してターゲットにできる。
@Inject public Vehicle(Engine<V8> engine) { ... }
Bean は、型ではなく、スーパータイプまたはインターフェースとして表示されるようになった。これは、実装クラスが直接検索され、Bean がインターフェースによって検索されるのを防ぐために使用できる。
@Bean(typed = Engine.class) class V8Engine implements Engine { }
以前は、@PostConstruct
や @PreDestroy
などのライフサイクルメソッドにアスペクト指向プログラミング (AOP) アドバイスを適用することはできなかった。しかし現在、コンストラクタとライフサイクルメソッドの両方のこれらのメソッドに AOP アドバイスをインターセプトできる。
もう1つの目新しさは、サーバフィルタの呼び出し方法にある: すべての条件下で、リクエストごとに1回だけ呼び出される。例外はフィルタに伝播されなくなった。代わりに、エラーレスポンスの結果はリアクティブストリームを通過する。以前は、例外がスローされた場合にサーバフィルタが複数回呼び出される可能性があった。
他の変更は、@Introspected
アノテーションを追加すると、クラスのリフレクティブな使用を可能にする GraalVM の構成も追加される GraalVM の領域で行われた。ほとんどの場合、これは必要ないため、この動作は使用できなくなった。復元するには、@ReflectiveAccess
アノテーションをクラスに追加する。これまで内部で起こっていたもう1つの「魔法」は、ネイティブイメージへの src/main/resources
フォルダーの追加だ。Micronaut ビルドプラグインのユーザは同じ動作を受け取るが、Maven ユーザはリソース構成の作成と保守の責任を負うようになった。
ほとんどのメジャーバージョンリリースと同様に、Micronaut 3.0 には重大な変更が含まれているが、OpenRewrite を使用した容易なアップグレードも約束されている。これは、アプリケーションを Micronaut 2 から Micronaut 3 にアップグレードするためにソースコードを変更するフレームワークだ。これは Maven または Gradle プラグインのいずれかで実現できる。
Micronaut は、2018年3月に Greach Conference で、OCI の Grails および Micronaut 製品リーダーのプリンシパルソフトウェアエンジニアである Graeme Rocher 氏によって正式に紹介された。その後、Micronaut は2018年5月下旬にオープンソースになった。最初の GA リリースから3年後、3番目のバージョンが統合リリースとして提供される。チームは、この期間中に収集されたすべての学習を実践し、アーキテクチャを改善し、使用できるライブラリとメモリフットプリントがどのようになるかなどをユーザにより多くの柔軟性を提供した。また、javax
名前空間に関連するライセンスの問題を回避するために、名前空間のネーミングを調整した。