Spring Boot の @Qualifier アノテーションは、同じ型の Bean が複数あるが、特定の Bean を注入したい場合のあいまいさを解決するために使用されます。これは、複数の候補が存在する場合に Spring がどの Bean を自動配線するかを決定するのに役立ちます。
@Qualifier が役立つ一般的なシナリオをすべて例とともに示します。
シナリオ 1: 同じタイプの複数の Bean
同じタイプの Bean が複数ある場合、特定の Bean を注入したいとします。
例:
import org.springframework.stereotype.Component; @Component public class Dog implements Animal { @Override public String sound() { return "Bark"; } } @Component public class Cat implements Animal { @Override public String sound() { return "Meow"; } }
ここでは、Dog と Cat の両方が Animal インターフェースを実装しています。
@Qualifier の使用法:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; @Service public class AnimalService { private final Animal animal; @Autowired public AnimalService(@Qualifier("cat") Animal animal) { this.animal = animal; } public String getAnimalSound() { return animal.sound(); } }
この例では、 @Qualifier("cat") アノテーションは、Cat Bean を AnimalService に注入する必要があることを指定しています。 @Qualifier がないと、Spring はあいまいさのために例外をスローします。
シナリオ 2: プライマリ Bean とセカンダリ Bean で @Qualifier を使用する
場合によっては、1 つの「プライマリ」Bean と、あまり使用されないその他の Bean がある場合でも、@Qualifier を使用して特定の Bean を注入できるようにしたい場合があります。
例:
@Component @Primary public class Dog implements Animal { @Override public String sound() { return "Bark"; } } @Component public class Cat implements Animal { @Override public String sound() { return "Meow"; } }
@primary アノテーションにより、デフォルトで Dog が確実に挿入されます。ただし、@Qualifier を使用して Cat を挿入することはできます。
@primary をオーバーライドするための @Qualifier の使用:
@Service public class AnimalService { private final Animal animal; @Autowired public AnimalService(@Qualifier("cat") Animal animal) { this.animal = animal; } public String getAnimalSound() { return animal.sound(); } }
この場合、Dog が @primary としてマークされているにもかかわらず、@Qualifier アノテーションにより Cat Bean が挿入されます。
シナリオ 3: コンストラクター インジェクションとフィールド インジェクションを使用した @Qualifier
@Qualifier は、コンストラクターベースとフィールドベースの両方の注入で使用できます。
例: @Qualifier を使用したフィールド注入:
@Service public class AnimalService { @Autowired @Qualifier("dog") private Animal animal; public String getAnimalSound() { return animal.sound(); } }
この場合、@Qualifier("dog") により、Dog Bean が AnimalService に確実に挿入されます。
シナリオ 4: メソッド パラメーター インジェクションを使用した @Qualifier
メソッドのパラメーターを介して依存関係を注入するときに @Qualifier を使用することもできます。
例:
@Service public class AnimalService { private Animal animal; @Autowired public void setAnimal(@Qualifier("dog") Animal animal) { this.animal = animal; } public String getAnimalSound() { return animal.sound(); } }
ここで、 @Qualifier("dog") は、Dog Bean がセッター メソッドを通じて挿入されることを保証します。
シナリオ 5: カスタム アノテーションを使用した @Qualifier
カスタム修飾子を作成して Bean 名のハードコーディングを回避し、コードをクリーンにして保守しやすくすることができます。
例: カスタム修飾子:
カスタム修飾子の作成:
import org.springframework.beans.factory.annotation.Qualifier; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Qualifier @Retention(RetentionPolicy.RUNTIME) public @interface DogQualifier { }
カスタム修飾子を適用します:
@Component @DogQualifier public class Dog implements Animal { @Override public String sound() { return "Bark"; } } @Component public class Cat implements Animal { @Override public String sound() { return "Meow"; } }
カスタム修飾子を使用して挿入:
@Service public class AnimalService { private final Animal animal; @Autowired public AnimalService(@DogQualifier Animal animal) { this.animal = animal; } public String getAnimalSound() { return animal.sound(); } }
この例では、@Qualifier("dog") を使用する代わりに、@DogQualifier を使用して、注入する Bean を指定します。
シナリオ 6: コレクション内の @Qualifier
Bean のコレクションを自動配線するときに @Qualifier を使用して、特定の Bean のみが確実に挿入されるようにすることができます。
例:
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @Component @Qualifier("domestic") public class Dog implements Animal { @Override public String sound() { return "Bark"; } } @Component @Qualifier("domestic") public class Cat implements Animal { @Override public String sound() { return "Meow"; } } @Component public class Lion implements Animal { @Override public String sound() { return "Roar"; } }
コレクションでの使用:
@Service public class AnimalService { private final List<Animal> animals; @Autowired public AnimalService(@Qualifier("domestic") List<Animal> animals) { this.animals = animals; } public void printAnimalSounds() { animals.forEach(animal -> System.out.println(animal.sound())); } }
この例では、@Qualifier("domestic") でマークされているため、Dog Bean と Cat Bean のみが挿入されます。
概要:
@Qualifier は、同じタイプの候補が複数ある場合に特定の Bean を注入するのに役立ちます。
コンストラクター インジェクション、フィールド インジェクション、メソッド インジェクション、カスタム修飾子などのシナリオで使用され、コレクションでも使用されます。
これらのシナリオを理解することで、@Qualifier を効果的に使用して曖昧さを解決し、Spring Boot アプリケーションで Bean インジェクションを管理できるようになります。
以上が@Qualifier アノテーション Spring Boot の説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。