@Qualifier注解有什么作用

tim-qtp...大约 1 分钟Spring框架

在Spring中,如果一个接口有多个实现类,或者一个类有多个实例被定义为Bean,Spring在进行依赖注入时可能会不知道该注入哪一个。此时,@Qualifier注解可以明确指定注入的Bean的名称,从而解决这种歧义。

假设我们有一个MessageService接口,它有两个实现类:EmailServiceSmsService

public interface MessageService {
    void sendMessage(String message);
}

@Component("emailService")
public class EmailService implements MessageService {
    @Override
    public void sendMessage(String message) {
        System.out.println("Sending email: " + message);
    }
}

@Component("smsService")
public class SmsService implements MessageService {
    @Override
    public void sendMessage(String message) {
        System.out.println("Sending SMS: " + message);
    }
}

或被定义成bean是这个意思:

@Configuration
public class AppConfig {
    // 定义第一个Bean实例
    @Bean(name = "emailService")
    public MessageService emailService() {
        return new MessageService("Email");
    }

    // 定义第二个Bean实例
    @Bean(name = "smsService")
    public MessageService smsService() {
        return new MessageService("SMS");
    }
}

在上面的代码中,EmailServiceSmsService都被定义为Bean,并且分别指定了Bean的名称(emailServicesmsService)。

现在,假设我们有一个MessageClient类,它需要注入一个MessageService类型的Bean。如果没有@Qualifier注解,Spring会报错,因为它不知道应该注入EmailService还是SmsService

@Component
public class MessageClient {
    // 注入emailService
    @Autowired
    @Qualifier("emailService")
    private MessageService emailService;

    // 注入smsService
    @Autowired
    @Qualifier("smsService")
    private MessageService smsService;

    public void sendEmail(String message) {
        emailService.sendMessage(message);
    }

    public void sendSms(String message) {
        smsService.sendMessage(message);
    }
}

在上面的代码中,@Qualifier("emailService")明确指定了注入的Bean是名称为emailServiceMessageService

测试代码

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(MessageClient.class);
        MessageClient client = context.getBean(MessageClient.class);
        client.sendMessage("Hello, World!");
    }
}

运行上述代码后,输出如下:

Sending email: Hello via Email!
Sending SMS: Hello via SMS!