所以,如果我理解正确的话,如果有多个候选者,这两种方法都是确定自动装配哪个 bean 的方法。那么到底有什么区别呢?
原文由 Maciaz 发布,翻译遵循 CC BY-SA 4.0 许可协议
所以,如果我理解正确的话,如果有多个候选者,这两种方法都是确定自动装配哪个 bean 的方法。那么到底有什么区别呢?
原文由 Maciaz 发布,翻译遵循 CC BY-SA 4.0 许可协议
@Qualifier
应始终与 @Autowired
结合使用。这将指示在应用程序上下文中存在多个具有相同类型的 beans 的情况下需要自动装配的 bean 名称。(以便 spring 可以按名称自动装配。)
@Primary
应该与 @Bean
/ @Autowired
结合使用,这表明当存在多个bean时,应该给予相同类型的bean更高的优先级。
您将使用 @Primary
的经典用例之一是当框架(例如 spring-data)需要某种类型的 bean(例如 EntityManager)但您有多个数据源并且您会配置多个实体管理器时.在这种情况下 @Qualifier
并没有多大帮助。
原文由 pvpkiran 发布,翻译遵循 CC BY-SA 3.0 许可协议
8 回答6.5k 阅读
4 回答709 阅读✓ 已解决
2 回答3.4k 阅读
3 回答1.9k 阅读✓ 已解决
1 回答2.2k 阅读✓ 已解决
1 回答2.1k 阅读✓ 已解决
1 回答972 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
2 回答874 阅读✓ 已解决
2 回答801 阅读✓ 已解决
2 回答938 阅读✓ 已解决
2 回答1.5k 阅读✓ 已解决
阅读
@Primary
作为“默认值”。如果一个bean有
@Autowired
没有 任何@Qualifier
,并且存在多个该类型的bean,则标记为@Primary
的候选bean将被选择,即默认选择,当没有其他信息可用时,即缺少@Qualifier
时。一个很好的用例是,最初您只有一个类型的 bean,因此没有使用任何代码
@Qualifier
。然后,当您添加另一个 bean 时,您还将@Qualifier
添加到旧 bean 和新 bean,因此任何@Autowired
都可以选择它想要的那个。通过同时将@Primary
添加到旧的原始 bean,您不必将@Qualifier
添加到所有现有的@Autowired
他们是“祖父”,可以这么说。@Primary
如果@Autowired
想要一个特定的 bean,也很好。这样,只有想要其他 bean 的@Autowired
需要指定@Qualifier
。这样,您就拥有了所有自动装配所需的主要 bean,并且@Qualifier
仅用于请求“备用”bean。