gpt4 book ai didi

spring - 在 Spring 中何时使用 Qualifier 和 Primary

转载 作者:行者123 更新时间:2023-12-03 18:31:39 26 4
gpt4 key购买 nike

我读过@Qualifier 可以用于注入(inject)阶段,而@Primary 用于配置阶段。我仍然不清楚何时使用哪个。

我也有以下疑问

  • @Primary 和 @Qualifier 可以一起使用吗?如果是,@Qualifier 是否优先?
  • @Primary 可以与@Autowired 一起使用吗?
  • 注入(inject)阶段与配置阶段有何不同,这对于 Spring bean
  • 最佳答案

    @Primary表示当有多个候选者时,应该优先考虑一个bean
    有资格 Autowiring 单值依赖项。@Qualifier表示当有多个候选者时,应该 Autowiring 特定的 bean。
    例如,我们有两个 bean 都实现了相同的接口(interface)。

    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") 都可以 Autowiring 到 BeanService因为它们实现了相同的接口(interface) BeanInterface .它在我的想法中报告了一个错误。
    Could not autowire. There is more than one bean of 'BeanInterface' type.
    Beans: bean1   (Config.java)
    bean2   (Config.java)
    并且没有任何提示,Spring 不知道该使用哪一个。
    所以在我们的例子中,当我们添加 @PrimaryConfig.bean1() .
    @Bean("bean1")
    @Primary
    public BeanInterface bean1() {
    return new Bean1();
    }
    它告诉 Spring,“当您发现多个 bean 都可以 Autowiring 时,请使用 主要的 作为您的首选。”所以,Spring 会选择 bean1自动连接到 BeanService .
    这是自动接线的另一种方法 bean1BeanService通过使用 @QualifierBeanService.class .
    @Service
    public class BeanService {

    @Autowired
    @Qualifier("bean1")
    private BeanInterface bean;
    }
    @Qualifier会告诉 Spring,“不管你找到多少 bean , 就用我告诉你的那个。
    所以你可以找到 @Qualifier@Primary当多个候选人有资格 Autowiring 时,告诉 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”。

    关于spring - 在 Spring 中何时使用 Qualifier 和 Primary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56642356/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com