我目前刚刚开始使用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?
答案 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;