【问题标题】:Spring autowire not behaving as expected弹簧自动装配未按预期运行
【发布时间】:2010-09-20 18:27:58
【问题描述】:

我尝试使用 @Autowire 为测试类自动装配 bean,但是 bean 没有装配,我得到了这个异常:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: 
    No matching bean of type [com.abc.MyDaoHibernateImpl] 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)}

我的测试类如下所示:

package com.abc;

@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
@TransactionConfiguration(transactionManager = "hibernateTransactionManager")
public class MyDaoHibernateImplTest
    extends AbstractTransactionalJUnit4SpringContextTests
{

    @Autowired
    private MyDaoHibernateImpl myDao;

    ....
}

applicationContext.xml 文件有这个 bean 定义:

<bean id="myDao" class="com.abc.MyDaoHibernateImpl">
    <property name="sessionFactory" ref="hibernateSessionFactory" />
</bean>

谁能看出我哪里出错了?

提前感谢您的任何建议。

--詹姆斯

【问题讨论】:

    标签: java spring dependency-injection autowired


    【解决方案1】:

    作为axtavt suggests,spring 是一个非常支持使用接口的框架。 Spring 的最佳实践是定义对接口的依赖项并让 Spring 注入实现。这就是依赖注入的全部意义:你指定你需要的接口,但容器会注入它选择的实现类,它可以是你创建的类,也可以是基于这个类的动态代理。但是一个类不应该知道它的依赖的实现细节。

    这是Spring Proxying Mechanism的参考。

    关于使用接口的一般概念,您应该阅读Effective Java by Joshua Bloch,第 8 章,第 52 项:通过接口引用对象。此外,您应该阅读 Sun Java 教程中的 Interfaces and Inheritance

    【讨论】:

      【解决方案2】:

      我猜你的 bean 的实际类型被用于应用方面的 dynamic proxy 所掩盖。在这种情况下,您需要对自动装配字段使用接口而不是类(或使用proxy-target-class="true" 强制目标类代理策略)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-18
        • 2014-07-08
        • 2016-09-27
        • 1970-01-01
        • 1970-01-01
        • 2019-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多