Spring @Lazyアノテーションのクイックガイド

Spring @Lazyアノテーションのクイックガイド

1. 概要

By default, Spring creates all singleton beans eagerly at the startup/bootstrapping of the application context.この背後にある理由は単純です。実行時ではなく、考えられるすべてのエラーを即座に回避して検出するためです。

ただし、アプリケーションコンテキストの起動時ではなく、リクエストしたときにBeanを作成する必要がある場合があります。

このクイックチュートリアルでは、Springの@Lazyアノテーションについて説明します。

2. 遅延初期化

@Lazyアノテーションは、Springバージョン3.0以降に存在しています。 Beanを遅延初期化するようにIoCコンテナに指示する方法はいくつかあります。

2.1. @Configurationクラス

When we put @Lazy annotation over the @Configuration class, it indicates that all the methods with @Bean annotation should be loaded lazily

これは、XMLベースの構成のdefault-lazy-init=“ true _“ _属性と同等です。

ここを見てみましょう:

@Lazy
@Configuration
@ComponentScan(basePackages = "com.example.lazy")
public class AppConfig {

    @Bean
    public Region getRegion(){
        return new Region();
    }

    @Bean
    public Country getCountry(){
        return new Country();
    }
}

機能をテストしましょう:

@Test
public void givenLazyAnnotation_whenConfigClass_thenLazyAll() {

    AnnotationConfigApplicationContext ctx
     = new AnnotationConfigApplicationContext();
    ctx.register(AppConfig.class);
    ctx.refresh();
    ctx.getBean(Region.class);
    ctx.getBean(Country.class);
}

ご覧のとおり、すべてのBeanは、最初に要求したときにのみ作成されます。

Bean factory for ...AnnotationConfigApplicationContext:
...DefaultListableBeanFactory: [...];
// application context started
Region bean initialized
Country bean initialized

これを特定のBeanにのみ適用するには、クラスから@Lazyを削除しましょう。

次に、目的のBeanの構成に追加します。

@Bean
@Lazy(true)
public Region getRegion(){
    return new Region();
}

2.2 With @Autowired

先に進む前に、これらのガイドで@Autowiredおよび@Componentアノテーションを確認してください。

ここで、in order to initialize a lazy bean, we reference it from another one.

遅延ロードするBean:

@Lazy
@Component
public class City {
    public City() {
        System.out.println("City bean initialized");
    }
}

そしてそれは参考です:

public class Region {

    @Lazy
    @Autowired
    private City city;

    public Region() {
        System.out.println("Region bean initialized");
    }

    public City getCityInstance() {
        return city;
    }
}

@Lazyは両方の場所で必須であることに注意してください。

Cityクラスの@Componentアノテーションを使用し、@Autowired:で参照している間

@Test
public void givenLazyAnnotation_whenAutowire_thenLazyBean() {
    // load up ctx appication context
    Region region = ctx.getBean(Region.class);
    region.getCityInstance();
}

ここで、the City bean is initialized only when we call the getCityInstance() method.

3. 結論

このクイックチュートリアルでは、Springの@Lazyアノテーションの基本を学びました。 構成および使用するいくつかの方法を検討しました。

いつものように、このガイドの完全なコードはover on GitHubで入手できます。