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

新手上路,请多包涵

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

原文由 Maciaz 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 551
2 个回答

阅读 @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。

原文由 Andreas 发布,翻译遵循 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题