Spring @Autowired有2个相同类型的bean

时间:2010-10-13 16:06:35

标签: java spring

我有以下定义。

@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。如果我将@Qualifiers用于两个不同的bean,则dao是不同的,并且功能按预期工作。

这是一个更简洁的版本。我遗漏了其他豆子,因为它们不相关。

的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-服务-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文件中。

2 个答案:

答案 0 :(得分:8)

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

  

byName

     

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

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

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

消除bean的歧义
  • @Qualifier(正如您所说)
  • @Resource而不是@Autowired(正如skaffman所说)

答案 1 :(得分:1)

@Autowired注释与基于xml的bean定义的“按类型的autowire”规范略有不同。

使用注释时,您在技术上并不是在做自动线...您正在根据注释设置值。 autowire注释与xml属性元素具有相同的功能。