@DependsOnアノテーションを使用したBean作成順序の制御
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]にあります。