1.概要

Springはデフォルトで、Beanのライフサイクルを管理し、それらの初期化順序を調整します。

しかし、私たちはまだ自分のニーズに基づいてそれをカスタマイズすることができます。 ** 初期化順序を管理するために

SmartLifeCycle

インターフェースまたは

@ DependsOn

アノテーションのいずれかを選択できます。

このチュートリアルでは、@ @ DependsOn__アノテーションと、Beanまたはlinkがない場合の動作について説明します。あるいは、あるBeanを別のBeanの前に初期化するだけでよい場合もあります。

2. Maven

まず最初に、

pom.xml

ファイルにスプリングコンテキスト依存関係をインポートしましょう。

theについては、常にMaven Centralを参照してください。最新版

の依存関係:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.0.7.RELEASE</version>
</dependency>

3.

@ DependsOn

このアノテーションを使用してBeanの依存関係を指定します。 Springは現在のbeanの初期化を試みる前に定義されたbeanが初期化されることを保証します。


FileReader



FileWriter

に依存する

FileProcessor

があるとしましょう。この場合、

FileReader



FileWriter

は、

FileProcessor

の前に初期化する必要があります。

4.設定

設定ファイルは、

@ Configuration

アノテーションを持つ純粋なJavaクラスです。

@Configuration
@ComponentScan("com.baeldung.dependson")
public class Config {

    @Bean
    @DependsOn({"fileReader","fileWriter"})
    public FileProcessor fileProcessor(){
        return new FileProcessor();
    }

    @Bean("fileReader")
    public FileReader fileReader() {
        return new FileReader();
    }

    @Bean("fileWriter")
    public FileWriter fileWriter() {
        return new FileWriter();
    }
}


  • FileProcessor

    は、その依存関係を

    @ DependsOn

    ** で指定します。

    Component

    に__ @ DependsOnで注釈を付けることもできます。

@Component
@DependsOn({"filereader", "fileWriter"})
public class FileProcessor {}

5.使い方

1つのクラス

File

を作成しましょう。各Beanは、

File

内のテキストを更新します。

FileReader

はそれを既読として更新します。

FileWriter

はそれを書き込みとして更新し、

FileProcessor

は処理されたとおりにテキストを更新します。

@Test
public void WhenFileProcessorIsCreated__FileTextContains__Processed() {
    FileProcessor processor = context.getBean(FileProcessor.class);
    assertTrue(processor.process().endsWith("processed"));
}

5.1. 依存関係がない

依存関係が欠落している場合、Springは

NoSuchBeanDefinitionException

を基本例外として

BeanCreationException

をスローします。

NoSuchBeanDefinitionException


ここ

たとえば、

dummyFileProcessor

Beanは

dummyFileWriter

Beanに依存しています。

dummyFileWriter

は存在しないため、__BeanCreationExceptionがスローされます。

@Test(expected=NoSuchBeanDefinitionException.class)
public void whenDependentBeanNotAvailable__ThrowsNosuchBeanDefinitionException(){
    context.getBean("dummyFileProcessor");
}

5.2. 循環依存

また、この場合は

BeanCreationException

がスローされ、Beanに循環依存関係があることが強調表示されます。

……
@Bean( “dummyFileProcessorCircular”)
@DependsOn({“dummyFileReaderCircular”})
@ラジー
public FileProcessor dummyFileProcessorCircular(){
    新しいFileProcessor(file)を返します。
}
……

  • 循環的な依存関係は、Beanがそれ自体に最終的な依存関係を持っている場合に発生する可能性があります。

Bean1 -> Bean4 -> Bean6 -> Bean1

[[“key-points]]

6.キーポイント

最後に、

@ DependsOn

アノテーションを使用する際に注意すべき点がいくつかあります。

  • **

    @ DependsOnを使用している間、

    コンポーネントスキャンを使用する必要があります


  • DependsOn

    アノテーション付きクラスがXMLを介して宣言されている場合

注釈メタデータは無視されます

[[“conclusion]]

7.まとめ


@ DependsOn

は、複雑な依存関係を必要とするシステムを構築するときに特に役立ちます。

これはDependency Injectionを容易にし、Springが依存クラスをロードする前に必要なBeanの初期化をすべて処理したことを確認します。

いつものように、コードはhttps://github.com/eugenp/tutorials/tree/master/spring-core[over on GitHub]にあります。