Spring Boot 2の遅延初期化

1. 概要

このチュートリアルでは、https://www.baeldung.com/new-spring-boot-2 [Spring Boot 2.2]から始まるアプリケーションレベルで遅延初期化を構成する方法を説明します。

2. 遅延初期化

Springのデフォルトでは、定義済みのすべてのBeanとその依存関係は、アプリケーションコンテキストの作成時に作成されます。
*対照的に、遅延初期化を使用してBeanを構成する場合、* * Beanは必要な場合にのみ作成され、その依存関係が挿入されます。*

3. Mavenの依存関係

アプリケーションでSpring Boot 2.2を取得するには、クラスパスに含める必要があります。
Mavenを使用すると、https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter [_spring-boot-starter_依存関係]を追加できます。
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>2.2.0.M3</version>
    </dependency>
</dependencies>

<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
    </repository>
</repositories>
このチュートリアルではマイルストーンリリースを使用しているため、リポジトリは必要なだけです。

4. 遅延初期化を有効にする

Spring Boot 2.2では、_spring.main.lazy-initialization_プロパティが導入され、アプリケーション全体で遅延初期化を簡単に設定できるようになりました。
*プロパティ値を_true_に設定すると、アプリケーション内のすべてのBeanが遅延初期化を使用します。*
application.yml設定ファイルでプロパティを設定しましょう:
spring:
  main:
    lazy-initialization: true
または、その場合は、application.propertiesファイルで次のようにします。
spring.main.lazy-initialization=true
この構成は、コンテキスト内のすべてのBeanに影響します。 したがって、特定のBeanの遅延初期化を構成する場合は、https://www.baeldung.com/spring-lazy-annotation [_ @ Lazy_ approach]を使用して構成できます。
さらに、_false_に設定された_ @​​ Lazy_アノテーションと組み合わせて、新しいプロパティを使用できます。
または、言い換えると、定義されたすべてのBeanは、_ @ Lazy(false)_ ** __.__で明示的に構成されたBeanを除き、遅延初期化を使用します

5. Run

今説明した内容をテストできるようにする簡単なサービスを作成しましょう。
コンストラクターにメッセージを追加することにより、Beanが作成された正確なタイミングがわかります。
public class Writer {

    private final String writerId;

    public Writer(String writerId) {
        this.writerId = writerId;
        System.out.println(writerId + " initialized!!!");
    }

    public void write(String message) {
        System.out.println(writerId + ": " + message);
    }

}
また、_SpringApplication_を作成し、以前に作成したサービスを注入しましょう。
@SpringBootApplication
public class Application {

    @Bean("writer1")
    public Writer getWriter1() {
        return new Writer("Writer 1");
    }

    @Bean("writer2")
    public Writer getWriter2() {
        return new Writer("Writer 2");
    }

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);
        System.out.println("Application context initialized!!!");

        Writer writer1 = ctx.getBean("writer1", Writer.class);
        writer1.write("First message");

        Writer writer2 = ctx.getBean("writer2", Writer.class);
        writer2.write("Second message");
    }
}
_spring.main.lazy-initializationプロパティ値をs_falseに設定して、アプリケーションを実行してみましょう。
Writer 1 initialized!!!
Writer 2 initialized!!!
Application context initialized!!!
Writer 1: First message
Writer 2: Second message
ご覧のとおり、Beanはアプリケーションコンテキストの起動時に作成されました。
_spring.main.lazy-initialization_の値を_true_に変更して、アプリケーションを再度実行しましょう。
Application context initialized!!!
Writer 1 initialized!!!
Writer 1: First message
Writer 2 initialized!!!
Writer 2: Second message
*その結果、アプリケーションは起動時にBeanを作成せず、必要なときにのみBeanを作成しました。*

6. 遅延初期化の影響

アプリケーション全体で遅延初期化を有効にすると、プラスとマイナスの両方の効果が生じる可能性があります。
それらのいくつかについて説明しましょう。新しいもののhttps://spring.io/blog/2019/03/14/lazy-initialization-in-spring-boot-2-2 [公式発表]機能:
  1. 遅延初期化により、作成されるBeanの数が減る場合があります。
    アプリケーションが起動しています-したがって、アプリケーションの起動時間を改善できます

  2. Beanは必要になるまで作成されないため、マスクすることができます
    問題、起動時ではなく実行時に取得

  3. 問題には、メモリ不足エラー、誤設定、または
    クラス定義で見つかったエラー

  4. また、Webコンテキストの場合は、オンデマンドでBean作成をトリガーします
    HTTPリクエストのレイテンシが増加します
    -Beanの作成は最初のリクエストにのみ影響しますが、これは負荷分散と自動スケーリングにマイナスの影響を与える可能性があります

7. 結論

このチュートリアルでは、Spring Boot 2.2で導入された新しいプロパティ_spring.main.lazy-initialization、_で遅延初期化を設定しました。
いつものように、このチュートリアルのソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-boot-performance[GitHubで]から入手できます。