@Primary与@Autowired与@Qualifier注释之间的区别

时间:2018-01-25 16:34:01

标签: java spring annotations

所以,如果我理解正确的话,如果有多个候选者,两者都是确定哪个bean自动装配的方法。那究竟是什么区别?

3 个答案:

答案 0 :(得分:18)

@Primary作为"默认"。

如果bean有@Autowired 没有任何@Qualifier,并且存在多个类型的bean,则会选择标记为@Primary的候选bean,即它是没有其他信息可用时的默认选择,即缺少@Qualifier时。

一个很好的用例是,最初你只有一个类型的bean,所以没有一个代码使用@Qualifier。然后,当您添加另一个bean时,您还要将@Qualifier添加到旧Bean和新Bean,因此任何@Autowired都可以选择它想要的bean。通过将@Primary添加到旧原始bean,您也不必将@Qualifier添加到所有现有@Autowired。他们已经过了#34;可以这么说。

@Primary也很好,例如95%的@Autowired想要一个特定的bean。这样,只有想要其他bean的@Autowired需要指定@Qualifier。这样,您就拥有了所有自动装配的主要bean,而@Qualifier仅用于请求"备用"豆。

答案 1 :(得分:5)

@Qualifier应始终与@Autowired结合使用。这将指示在应用程序上下文中存在多个具有相同类型的bean时需要自动装配的bean名称。(以便spring可以按名称自动装配。)

@Primary应与@Bean / @Autowired结合使用,表示当存在多个相同类型的bean时,哪个bean应该被赋予更高的首选项。

使用@Primary的一个经典用例是框架(例如spring-data)需要某种类型的bean(例如EntityManager),但是你有多个数据源并且你已经配置了多个实体经理。在这种情况下,@Qualifier并没有多大帮助。

答案 2 :(得分:4)

<强> @Qualifier

如果有一个以上的实例可用于注入点,那么我们可以使用@Qualifier注释来解决歧义。由于在注入点使用@Qualifier,可能会出现两种情况:我们不希望或不能使用@Qualifier

  1. 自动装配模式为Autowire.BY_TYPE时。然后,当然,我们不能使用@Qualifier,因为我们实际上没有将用户定义的注入点指定为@Autowired@Inject
  2. 我们想做豆类选择(即解决歧义) 配置时间而不是bean开发时间。
  3. 上述问题的解决方案是使用@Primary注释。

    <强> @Primary

    这表示当多个bean可以自动装配到单值依赖项时,应该优先选择特定的bean。如果候选者中只存在一个“主”bean,则它将是自动装配的值。