ホームページ  >  記事  >  Java  >  @Qualifier アノテーション Spring Boot の説明

@Qualifier アノテーション Spring Boot の説明

Patricia Arquette
Patricia Arquetteオリジナル
2024-09-22 18:17:321066ブラウズ

@Qualifier Annotation Spring Boot Explained

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。