我有一个spring autowire功能的问题,它发现了两个具有相同类型的bean,但实际上我只有一个bean和这个bean正在实现的接口。
在applicationContext.xml中,我有以下几行:
<context:component-scan base-package="xxx.vs.services"/>
<context:component-scan base-package="xxx.vs.dao"/>
<context:annotation-config/>
<bean id="intermedDao" class="xxx.vs.dao.yyy.IntermedDaoImpl" />
和:
package xxx.vs.dao.abs.yyy;
public interface IntermedDao extends GenericDao<Intermed> {
// methods here
}
package xxx.vs.dao.yyy;
import org.springframework.stereotype.Repository;
@Repository
public class IntermedDaoImpl extends GenericInboundDaoImpl<Intermed> implements IntermedDao {
// methods here
}
package xxx.vs.services.yyy;
@Service
@Transactional
public class IntermedServiceImpl implements IntermedService {
@Autowired
IntermedDao dao;
public IntermedDao getDao() {
return dao;
}
public void setDao(IntermedDao dao) {
this.dao = dao;
}
}
使用此配置我得到:
java.lang.Exception: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'intermedServiceImpl':
Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException:
Could not autowire field: xxx.vs.dao.abs.yyy.IntermedDao xxx.vs.services.yyy.IntermedServiceImpl.dao; nested exception is
org.springframework.beans.factory.NoSuchBeanDefinitionException:No unique bean of type [xxx.vs.dao.abs.yyy.AgentDao] is defined: expected single matching bean but found 2: [intermedDaoImpl, intermedDao]
是否会发生这种情况,因为我扫描包含我的DAO类正在实现的接口的包?
答案 0 :(得分:5)
您正在创建dao bean的两个实例,一个在XML中,另一个使用@Repository
注释。
仔细查看错误:
expected single matching bean but found 2: [intermedDaoImpl, intermedDao]
要么只创建一个bean实例(以XML或注释方式),要么在连接时使用@Qualifier
来指定要使用的实例。
答案 1 :(得分:4)
这种情况正在发生,因为你们都明确声明了一个bean:
<bean id="intermedDao" class="xxx.vs.dao.yyy.IntermedDaoImpl" />
以及声明要通过组件扫描获取@Repository
:
@Repository
public class IntermedDaoImpl
你需要做一个或另一个,而不是两个。我建议删除<bean>
。
请注意错误消息:
预期单个匹配bean但找到2:[intermedDaoImpl,intermedDao]
提到冲突的bean。第一个是你的@Repository
,其中bean的名称是从类名自动生成的;第二个是你的<bean>
。