何时在 Spring 中使用 Qualifier 和 Primary

When to use Qualifier and Primary in Spring

我读到@Qualifier 可用于注入阶段,而@Primary 用于配置阶段。我还不清楚什么时候使用哪个。

我也有以下疑惑

是的,@Qualifier 优先。 是的,我们可以一起使用@Primary 和@Autowired。

@Configuration Class 与应用程序上下文相关,可用于配置应用程序级配置。

@Primary表示当有多个candidates时应该优先考虑一个bean 有资格自动装配 single-valued 依赖项。

@Qualifier 表示当有多个候选时,应该自动装配特定的 bean。

例如,我们有两个 bean 都实现了相同的接口。

public interface BeanInterface {

    String getName();
}


public class Bean1 implements BeanInterface {
    @Override
    public String getName() {
        return "bean 1";
    }
}


public class Bean2 implements BeanInterface {
    @Override
    public String getName() {
        return "bean2";
    }
}

这是我们的服务。

@Service
public class BeanService {

    @Autowired
    private BeanInterface bean;
}

还有我们的配置。

@Configuration
public class Config {

    @Bean("bean1")
    public BeanInterface bean1() {
        return new Bean1();
    }

    @Bean("bean2")
    public BeanInterface bean2() {
        return new Bean2();
    }
}

当Spring启动时,它会发现有两个bean(“bean1”和“bean2”)都可以自动连接到BeanService,因为它们实现了相同的接口BeanInterface .它报告我的想法有错误。

Could not autowire. There is more than one bean of 'BeanInterface' type.
Beans: bean1   (Config.java) 
bean2   (Config.java) 

而且没有提示,Spring 不知道该用哪个。

所以在我们的例子中,当我们将 @Primary 添加到 Config.bean1() 时。

@Bean("bean1")
@Primary
public BeanInterface bean1() {
    return new Bean1();
}

它告诉 Spring,“当您发现多个 bean 都可以自动装配时,请使用 主要的 作为您的第一选择。”因此,Spring 将选择 bean1 自动连接到 BeanService

这是另一种将 bean1 自动连接到 BeanService 的方法,方法是在 BeanService.class.

中使用 @Qualifier
@Service
public class BeanService {

    @Autowired
    @Qualifier("bean1")
    private BeanInterface bean;
}

@Qualifier会告诉Spring,“不管你找到多少豆子,就用我告诉你的那个吧

所以你可以发现 @Qualifier@Primary 都告诉 Spring 在多个候选人有资格自动装配时使用特定的 bean。但是 @Qualifier 更具体并且具有高优先级。所以当@Qualifier@Primary都被找到时,@Primary将被忽略。

这是测试。

@Configuration
public class Config {

    @Bean("bean1")
    @Primary
    public BeanInterface bean1() {
        return new Bean1();
    }

    @Bean("bean2")
    public BeanInterface bean2() {
        return new Bean2();
    }
}

@Service
public class BeanService {

    @Autowired
    @Qualifier("bean2")
    private BeanInterface bean;

    @PostConstruct
    public void test() {
        String name = bean.getName();
        System.out.println(name);
    }
}

输出为“bean2”。

我们通常使用@Qualifier(“beanName”)注解来访问相同类型的bean。我们将它与 @Autowired 一起应用于注入点。在我们的例子中,我们 select 配置阶段的 bean,所以 @Qualifier 不能在这里应用。

要解决此问题,Spring 提供了 @Primary 注释和 @Bean 注释。

Source

此外,需要记住 @Qualifier 的优先级高于 @Primary,这意味着定义这两个注释是浪费。

@Primary表示默认实现,而@Qualifier是具体实现。

您可以查看我写的有关此注释的博客 - http://shaikezam.com/spring_qualifier