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

Mac*_*iaz 17 java spring annotations

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

And*_*eas 30

@Primary作"默认".

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

一个很好的用例是,最初你只有一个类型的bean,所以没有使用任何代码@Qualifier.然后当你添加另一个bean时,你也可以添加@Qualifier旧bean和新bean,所以任何人@Autowired都可以选择它想要的bean .通过添加@Primary到旧的原始bean,您不必添加@Qualifier到所有现有的bean @Autowired.可以这么说,他们是"骄傲"的.

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

  • 是的,我刚刚测试并证明了我的理论。`@Qualifier` > `@Primary` > 变量名匹配。 (5认同)

pvp*_*ran 6

@Qualifier应与@Autowired总是一起使用.这将指示在应用程序上下文中存在多个具有相同类型的bean的情况下需要自动装配的bean名称.(以便spring可以按名称自动装配.)

@Primary当存在多个相同类型的bean时,应该与@Bean/ 结合使用@Autowired,指示哪个bean应该被赋予更高的优先级.

您将使用的经典用例之一@Primary是当框架(示例spring-data)需要某种类型的bean(示例EntityManager)但您有多个数据源并且您将配置多个实体管理器时.在这种情况下@Qualifier不太有帮助.


rim*_*fiz 5

@Qualifier

如果一个注入点可以使用多个实例,那么我们可以使用@Qualifier注释来解决歧义。正如@Qualifier在注入点使用的那样,可能有两种情况我们不想使用或不能使用@Qualifier

  1. 当自动装配模式为时Autowire.BY_TYPE。然后,我们当然不能使用,@Qualifier因为我们实际上没有将用户定义的注入点指定为@Autowired@Inject
  2. 我们想在配置时而不是在bean开发时进行bean选择(即解决歧义)。

解决上述问题的方法是使用@Primary注释。

@主

这表示当多个bean可以自动连接到单值依赖项的候选对象时,应优先考虑特定的bean。如果候选对象中仅存在一个“主” bean,它将是自动装配的值。