无法使用@ Autowired处理bean

时间:2011-08-01 20:30:50

标签: java spring

我目前刚刚开始使用Spring并试图掌握它。但是我遇到了一个问题:我的@Autowired一直都在失败。

在我spring.xml我得到了这个:

<!--Handle @Autowired-->
<context:annotation-config />
<context:component-scan  base-package="org.MYPROJECT">
    <context:include-filter type="regex" expression=".*"/>
</context:component-scan>

当运行一些测试时,它失败了(我只是将最后一个异常显示为最重要的)

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.quackbot.dao.AdminDAO] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:920)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:789)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:474)
    ... 50 more

所以我尝试通过手动将bean添加到配置

来修复它
<bean id="AdminDAO" class="org.quackbot.dao.hibernate.AdminDAOHibernate">
</bean>

再次运行它,现在我得到了这个

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [org.quackbot.dao.AdminDAO] is defined: expected single matching bean but found 2: [adminDAOHibernate, AdminDAO]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:796)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:474)
    ... 50 more

似乎我在使用Spring时无法获胜...首先它抱怨豆子不存在,在指定它时它会抱怨太多了。这是怎么回事?为什么不能加载正确的bean?

4 个答案:

答案 0 :(得分:4)

你的dao中有注释吗?

类似于@Repository或@Component之类的东西,告诉Spring在扫描基础包时需要选择它吗?

答案 1 :(得分:1)

这已经足够了,在您的情况下不需要其他XML配置:

<context:component-scan base-package="org.quackbot"/>

其次,请确保AdminDAOHibernate实施AdminDAO

最后但并非最不重要的是,仔细检查注释为@Autowired的字段是否为AdminDAO(接口)类型。

最后一条建议:将默认构造函数添加到AdminDAOHibernate并在那里放置一些日志语句或放置断点。应该只对这个构造函数进行一次调用,尽管在涉及类代理时它会变得棘手。

答案 2 :(得分:1)

这是一个Spring MVC应用吗?无论如何,我猜你有两个独立的Spring上下文,无论你是否知道。在一个上下文中,您依赖于AdminDAO,但它不可用,这会导致您的第一个异常。您的其他上下文也依赖于已经满足的AdminDAO,但是当您手动添加另一个AdminDAO bean时,由于其中有两个而失败。

答案 3 :(得分:-1)

@Autowired using annotations

@Repository( “ExampleDao”) public class ExampleDaoImpl实现了ExampleDao

@服务( “ServiceExample”) 公共类ExampleServiceImpl实现ExampleService

@Controller 公共类ExampleController

@Autowired     private ExmpleService ServiceExample;