所以,如果我理解正确的话,如果有多个候选者,两者都是确定哪个bean自动装配的方法。那究竟是什么区别?
答案 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
。
Autowire.BY_TYPE
时。然后,当然,我们不能使用@Qualifier
,因为我们实际上没有将用户定义的注入点指定为@Autowired
或@Inject
上述问题的解决方案是使用@Primary
注释。
<强> @Primary 强>
这表示当多个bean可以自动装配到单值依赖项时,应该优先选择特定的bean。如果候选者中只存在一个“主”bean,则它将是自动装配的值。