我有以下定义。
@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文件中。
答案 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属性元素具有相同的功能。