📜  Spring @Qualifier 注解与示例(1)

📅  最后修改于: 2023-12-03 14:47:32.390000             🧑  作者: Mango

Spring @Qualifier 注解

在Spring框架中,当存在多个相同类型的Bean时,可以使用@Qualifier注解将其逐一区分。@Qualifier注解用于配合@Autowired注解来实现按名称自动注入依赖。

使用@Qualifier注解

假设存在一个接口Animal,并且有两个实现类CatDog

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");
    }
}

如果在其他类中想要注入CatDog,可以使用@Autowired注解,但是由于存在多个Animal的实现类,编译器会报错。

@Autowired
private Animal animal;

为了解决这个问题,可以在@Autowired注解中配合@Qualifier注解来指定具体要注入的Bean。

@Autowired
@Qualifier("cat")
private Animal animal;

上述代码中,@Qualifier("cat")指定了要注入的Bean名称为"cat",这样就可以正确注入Cat实例了。

配置@Bean方法使用@Qualifier

在使用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注解与自定义注解结合

除了使用@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注解有所帮助!