何时在Spring中使用Qualifier和Primary

时间:2019-06-18 05:38:13

标签: spring annotations

我已经阅读到@Qualifier可以在注入阶段使用,而@Primary可以在配置阶段使用。尚不清楚何时使用。

我还有以下疑问

  • @Primary和@Qualifier可以一起使用吗?如果是,@ Qualifier优先吗?

  • @Primary可以与@Autowired一起使用吗?

  • 在Spring Bean方面,注入阶段与配置阶段有何不同

3 个答案:

答案 0 :(得分:1)

@Primary表示当有多个候选者时,应优先考虑Bean 有资格自动装配单值依赖项。

@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时,请以 primary为主作为首选。”因此,Spring将选择bean1自动连线到BeanService

这是通过使用bean1中的BeanService@Qualifier自动连接到BeanService.class的另一种方法。

@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”。

答案 1 :(得分:0)

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

与应用程序上下文相关的

@Configuration类,将用于配置应用程序级别的配置。

答案 2 :(得分:0)

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

为了解决这个问题,Spring 提供了 @Primary 注释和 @Bean 注释。

Source