1

我尝试使用 为测试类自动装配 bean @Autowire,但是 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>

谁能看到我哪里出错了?

在此先感谢您的任何建议。

- 詹姆士

4

2 回答 2

1

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

这是Spring Proxying Mechanism的参考。

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

于 2010-09-21T07:38:19.820 回答
0

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

于 2010-09-20T19:04:35.817 回答