Spring Boot 2.2の遅延初期化







翻訳者から:Spring FrameworkはCUBAを構築する主要なフレームワークの1つであるため、新しいSpring機能に関するニュースは私たちに気付かれずに通されません。 遅延初期化は、アプリケーションが最初にロードされる時間を短縮する1つの方法です。これは、マイクロサービスが広く使用される時代では重要な指標です。 ビデオを読むことを好む人のためにジョシュ・ロングによる記事のトピックに関する10分間のプレゼンテーションがあります。







Spring Boot 2.2の最近発表された最初のマイルストーンリリースは、遅延初期化のサポートを追加します。 この記事では、新しい機能を見て、それを有効にする方法を説明します。







怠け者とはどういう意味ですか?



Spring Frameworkは、11年前にソースコードがgitに移行して以来、遅延初期化をサポートしています。 デフォルトでは、アプリケーションコンテキストが更新されると、各Beanが再作成され、その依存関係が実装されます。 対照的に、Beanが遅延初期化用に構成されている場合、Beanは作成されず、これが必要になるまで依存関係は置かれません。







遅延初期化を有効にする



Spring Bootのどのバージョンでも、 BeanFactoryPostProcessor



手を汚したくない場合は、遅延初期化を有効にすることができます。 Spring Boot 2.2は、新しいプロパティspring.main.lazy-initialization



導入することにより、このプロセスを単純化しspring.main.lazy-initialization



SpringApplication



SpringApplicationBuilder



も同等のメソッドがありSpringApplicationBuilder



)。 このプロパティをtrue



に設定すると、遅延初期化を使用するようにアプリケーションBeanが構成されます。







遅延初期化の利点



遅延初期化は、この段階でロードされるクラスとビンの作成が少なくなるため、アプリケーションの開始時間を大幅に短縮できます。 たとえば、アクチュエータとSpring Securityを使用する小さなWebアプリケーションは、通常2.5秒で起動します。 遅延初期化では、このプロセスに2秒かかります。 ビンの依存関係グラフの構造に応じて、正確な加速度値はアプリケーションごとに異なります。







翻訳者のメモ:依存関係でSpring Boot 2.2を書いてこのを実行しました。遅延初期化の開始時間は3秒で、それなしで4でした。より深刻なアプリケーションでは、遅延初期化の使用による開始時間の大幅な増加表示されません。 UPD:alek_sysのアドバイスにより、データベーススキーマの検証と更新が無効になり、両方のケースで遅延JPA初期化が有効になりました- Started WebApplication in...



れる前に2.7および3.7秒になりました







DevToolsはどうですか?



Spring Boot DevToolsは、開発を大幅に加速します。 何かを変更するたびにJVMとアプリケーションを再起動する代わりに、DevToolsは同じJVMでアプリケーションの「ホットリスタート」を行います。 このような再起動の大きな利点は、JITがアプリケーションの起動時に実行するコードを最適化する機会を与えることです。 数回再起動した後、2.5秒の初期時間はほぼ80%減少して500ミリ秒になります。 遅延初期化により、状況はさらに改善されます。 spring.main.lazy-initialization



プロパティを設定すると、IDEで直接再起動時間が400ミリ秒になります。







遅延初期化の裏側



上記のように、遅延初期化を含めると、アプリケーションの起動時間が大幅に短縮されます。 そして、おそらくあなたはこれを絶えず使用したいという魅力的な欲求を持っているでしょう、あるいは少なくともあなたはなぜ遅延初期化がデフォルトで有効にされていないのか疑問に思うでしょう。 すぐに明らかにするのが最適ないくつかの負の影響があります。







クラスがロードされず、必要になるまでビンが作成されないという事実は、アプリケーションの起動段階で以前に特定された可能性のある問題を隠すことができます。 たとえば、必要なクラスの不足、メモリオーバーフロー、間違った構成に関連するエラーなどが考えられます。







Webアプリケーションでは、遅延構成により、ビンの初期化を引き起こすHTTPリクエストのレイテンシが増加する可能性があります。 これは通常、最初の要求ですが、負荷分散または自動スケーリングに影響を与える追加の不要な影響がある場合があります。







これは含まれていますか?



遅延初期化がアプリケーションにどのように影響するのか正確にわからない場合、またはフレームワークの他の側面が自分に適していることを確認し、必要なことを実行したい場合は、このためにデバッガを使用すると便利です。 ビンコンストラクターにブレークポイントを設定すると、ビンが初期化される正確な瞬間を確認できます。 たとえば、Spring Bootで記述され、遅延初期化が有効になっているWebアプリケーションでは、 @Controller



アノテーションでマークされた@Controller



は、 DispatcerServlet



Spring MVCまたはDispatchHandler



Spring WebFluxへの最初の要求まで作成されないことがわかります。







遅延初期化をいつ有効にしますか?



上記で見たように、遅延初期化はアプリケーションの起動中に顕著な改善を提供しますが、欠点もあるため、この機能を非常に慎重に使用する必要があります。







遅延初期化が配当を支払うことができる1つの領域(オーバーヘッドなし)は、アプリケーション開発プロセスです。 アプリケーションの作成中、遅延ツールの初期化とDevToolsの組み合わせにより提供される再起動時間の短縮により、多くの時間を節約できます。







遅延初期化を使用する利点は他にどこで得られますか?これは統合テストです。 一部のタイプのテストで初期化されたBeanの数を制限することにより、すでにテストスライシングを使用して実行時間を短縮している場合があります。 遅延初期化は、同じ結果を達成する別の機会を提供します。 「スライス」テスト用にアプリケーションの構造を変更する間違った位置にある場合、または特定のテストに適切な「スライス」がない場合、遅延初期化を含めると、ビンの数がテストでのみ使用されるビンに制限されます。 これにより、特に開発中に隔離された環境で実行する場合、テストの実行時間が短縮されます。







最後にprodの遅延初期化をオンにします。 そして、あなたがそれをすることに決めたら、注意してそれをしてください。 Webアプリケーションの場合、コンテナマネージャは/health



エントリポイントに依存できます。これは通常、かなり迅速に応答しますが、最初の呼び出しには通常より時間がかかる可能性があることに注意してください。 また、すべてのコンポーネントが初期化されたときにオーバーフローが発生しないように、JVMに割り当てられたメモリサイズを覚えておく必要があります。








All Articles