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中文網其他相關文章!