【问题标题】:2 beans with same name but in different packages; how to autowire them?2个同名但在不同包中的bean;如何自动连接它们?
【发布时间】:2012-06-13 12:50:13
【问题描述】:

我有一个应用程序,它有 2 个同名的 bean,但它们位于不同的包中。我的 Spring 应用程序失败,因为它无法决定采用哪个 bean。有什么解决办法吗? bean 目前没有实现特定的接口。

请参见下面的异常编辑示例:

Caused by:
org.springframework.context.annotation.ConflictingBeanDefinitionException:
Annotation-specified bean name 'dataTransferHandler' for bean class
[aaaaa.ws.handler.DataTransferHandler] conflicts with existing,
non-compatible bean definition of same name and class
[bbbbb.ws.handler.DataTransferHandler]

【问题讨论】:

  • 看来唯一的解决办法就是用他们的确切名字来引用他们。

标签: spring inversion-of-control autowired


【解决方案1】:

您必须为您的 bean 提供不同的名称 - 如果多个 bean 定义为相同的名称,那么稍后定义的一个将覆盖之前定义的一个 - 因此在您的情况下,只有一个名称为 @987654321 的 bean 将存在@。

您可以为这两个 bean 指定不同的名称,以便它们都可以存在,并且您可以使用以下方法注入正确的一个: @AutoWired @Qualifier("dataTransferHandler") 或者 @Resource(name="dataTransferHandler")

【讨论】:

  • 给 bean 赋予不同的名称是指更改类名?
  • 不,bean 名称 - 如果您明确将其命名为 <bean name="aName"..>,或者如果您使用注释 @Service("aName")。在您的情况下,虽然这两个 bean 具有相同的名称,但它们的类型不同
【解决方案2】:

您可以将属性 primary="true" 赋予您希望在自动装配时具有偏好的 bean 定义。但是bean名称必须不同。同名bean没有解决办法。

在运行时,您将获得自动装配类,那么主要的真正 bean 将获得自动装配的偏好。希望这对您有所帮助。干杯。

【讨论】:

  • 这就是我在回答中提到的。该解决方案仅在 bean 名称不同并且没有相同名称的 bean 的解决方案时才有效。仔细阅读答案。
  • 没问题。谢谢。
【解决方案3】:

我问了另一个关于同一问题的问题,并且有一个不需要使用 @Qualifier 注释的解决方案:如果您的两个 DataTransferHandler 类都有 @Component 注释,您可以简单地添加一个 String 参数到其中一个它们的构造(即@Component("Foo")),这应该可以解决问题而无需额外的更改。

更多详情请见User9123's answer on my question。

【讨论】:

    猜你喜欢
    • 2013-01-08
    • 1970-01-01
    • 2018-06-07
    • 2013-07-04
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    相关资源
    最近更新 更多