【问题标题】:Spring @Autowired with 2 beans of the same typeSpring @Autowired 带有 2 个相同类型的 bean
【发布时间】:2010-10-13 16:06:34
【问题描述】:

我定义了以下内容。

@Autowired
DaoType1<object1> someDao;

@Autowired
DaoType1<object1> someListDao;

在我的 bean 定义中,我有两个相同类型的 bean

<bean id="someDao" class="com.example.DaoType1" />
<bean id="someListDao" class="com.example.DaoType1" />

第二个 bean 是从另一个 xml 文件中导入的,如果那样的话。它们也设置了不同的属性。为什么 spring 没有抛出错误,因为已经定义了 2 个相同类型的 bean。它是否使用变量名称,因为它们与 bean id 匹配。如果我对两个不同的 bean 使用了 @Qualifiers,则 dao 是不同的,并且功能按预期工作。

这是一个更简洁的版本。我省略了其他 bean,因为它们不相关。

applicationContext.xml

<import resource="classpath:dm-services-crud.xml"/>
<bean id="ruleListCrudService" class="com.idna.dm.service.crud.impl.RuleCrudServiceImpl"> 
    <property name="crudDao" ref="ruleListCrudDao" />
</bean>

dm-services-crud.xml

    <bean id="ruleCrudService" class="com.idna.dm.service.crud.impl.RuleCrudServiceImpl">
        <property name="crudDao" ref="ruleCrudDao" />
        <property name="ruleNetworkOfNodesCrudService" ref="ruleNetworkOfNodesCrudService" />
        <property name="elementMappingsCrudService" ref="elementMappingsCrudService" />
        <property name="ruleCrudDao" ref="newRuleCrudDao"/>
   </bean>

default-autowire 根本不存在于我的任何 xml 文件中。

【问题讨论】:

  • 嗯,我原以为会失败。也许它确实使用了字段名称。这就是它对 @Resource 所做的事情,所以这将是一致的。
  • 你能显示整个applicationContext.xml(两者)吗?

标签: java spring


【解决方案1】:

这似乎是预期的行为。 documentation 说:

按名称

按属性名称自动装配。 Spring 寻找与需要自动装配的属性同名的 bean。例如,如果一个 bean 定义被设置为按名称自动装配,并且它包含一个 master 属性(即,它有一个 setMaster(..) 方法),Spring 会查找一个名为 master 的 bean 定义,并使用它来设置属性。

我猜这意味着您在 applicationContext.xml 中指定了default-autowire="byName"

但是,重构可能会以不可预知的方式影响这一点。这就是为什么(我认为)建议切换到按类型自动装配,并通过使用来消除 bean 的歧义

  • @Qualifier(如您所述)
  • @Resource 而不是 @Autowired(如 skaffman 所述)

【讨论】:

  • 我明白这一点,所以我想知道为什么会这样。尽管我已将上面的代码设为通用代码,但我们目前正在我们的实时服务器上运行此代码,没有任何问题。
  • 看我转述的最后一段
  • 简短回答:它不起作用。 Spring 正在以它认为合适的方式解决自动装配问题。目前,这符合您想要的功能。你确实有一个潜在的歧义,你应该按照 Bozho 的描述解决它。
  • 好的,我明天看看代码库,如果是这样,请确认答案。谢谢。
  • @Bozho:您的链接指的是旧的 Spring 1.x 风格的自动装配,我认为这与 @Autowired 风格没有任何关系。不过,我愿意犯错。
【解决方案2】:

@Autowired 注释的行为与基于 xml 的 bean 定义的“按类型自动装配”规范略有不同。

使用注释时,从技术上讲,您并不是在进行自动连线……您是根据注释设置值。 autowire 注解与 xml 属性元素具有相同的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多