spring autowire 2 beans发现异常

时间:2012-03-02 08:12:26

标签: spring

我有一个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类正在实现的接口的包?

2 个答案:

答案 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>