首頁  >  文章  >  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 但想要注入特定的一個時出現的歧義。當存在多個候選者時,它可以幫助 Spring 確定應該自動組裝哪個 bean。

以下是所有 @Qualifier 有用的常見場景,並附有範例:

場景 1:相同類型的多個 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:將 @Qualifier 與主要和次要 Bean 一起使用

有時,您可能有一個「主要」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。

使用@Qualifier來覆蓋@primary:

@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") 確保透過 setter 方法注入 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();
    }
}

在這個例子中,@DogQualifier用來指定要注入哪個bean,而不是使用@Qualifier("dog")。

場景 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()));
    }
}

在此範例中,僅注入 Dog 和 Cat beans,因為它們被標記為 @Qualifier("domestic")。

摘要:

當存在多個相同類型的候選人時,@Qualifier 有助於注入特定的 beans。

它用於建構函數注入、欄位注入、方法注入、自訂限定符甚至集合等場景。

透過了解這些場景,您可以有效地使用 @Qualifier 來解決歧義並管理 Spring Boot 應用程式中的 bean 注入。

以上是@Qualifier 註解 Spring Boot 詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn