📅  最后修改于: 2023-12-03 14:47:32.390000             🧑  作者: Mango
在Spring框架中,当存在多个相同类型的Bean时,可以使用@Qualifier
注解将其逐一区分。@Qualifier
注解用于配合@Autowired
注解来实现按名称自动注入依赖。
假设存在一个接口Animal
,并且有两个实现类Cat
和Dog
。
public interface Animal {
void makeSound();
}
@Component
public class Cat implements Animal {
public void makeSound() {
System.out.println("Meow");
}
}
@Component
public class Dog implements Animal {
public void makeSound() {
System.out.println("Woof");
}
}
如果在其他类中想要注入Cat
或Dog
,可以使用@Autowired
注解,但是由于存在多个Animal
的实现类,编译器会报错。
@Autowired
private Animal animal;
为了解决这个问题,可以在@Autowired
注解中配合@Qualifier
注解来指定具体要注入的Bean。
@Autowired
@Qualifier("cat")
private Animal animal;
上述代码中,@Qualifier("cat")
指定了要注入的Bean名称为"cat",这样就可以正确注入Cat
实例了。
在使用Java配置类时,可以使用@Qualifier
注解在@Bean
方法中指定要创建的Bean的名称。
@Configuration
public class AnimalConfig {
@Bean
@Qualifier("cat")
public Animal cat() {
return new Cat();
}
@Bean
@Qualifier("dog")
public Animal dog() {
return new Dog();
}
}
上述代码中,通过@Qualifier
注解为cat()
和dog()
方法指定了Bean的名称。可以在其他类中使用@Autowired
和@Qualifier
来注入指定的Bean。
@Autowired
@Qualifier("cat")
private Animal animal;
除了使用@Qualifier
注解,还可以结合自定义注解来进一步简化代码。示例中创建了一个自定义注解@Pet
,用于标识宠物类型的Bean。
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})
public @interface Pet {
AnimalType type();
}
可以在@Bean
方法中使用@Pet
注解来标识宠物的类型。
@Configuration
public class AnimalConfig {
@Bean
@Pet(type = AnimalType.CAT)
public Animal cat() {
return new Cat();
}
@Bean
@Pet(type = AnimalType.DOG)
public Animal dog() {
return new Dog();
}
}
在其他类中可以使用@Autowired
和@Pet
注解来快速注入指定类型的宠物。
@Autowired
@Pet(type = AnimalType.CAT)
private Animal animal;
使用自定义注解可以更加语义化地表示所需的Bean类型。
通过@Qualifier
注解,我们可以解决在存在多个相同类型的Bean时的自动注入问题。可以通过在@Autowired
中使用@Qualifier
,或者在@Bean
方法中使用@Qualifier
或自定义注解来指定具体要注入的Bean。这样就能够按名称或其他自定义指标来精确注入对应的Bean了。
希望本文对您介绍Spring @Qualifier
注解有所帮助!