Spring autowire的行为不符合预期

时间:2010-09-20 18:27:59

标签: java spring dependency-injection autowired

我曾尝试使用@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>

谁能看到我出错的地方?

提前感谢任何建议。

- 詹姆斯

2 个答案:

答案 0 :(得分:1)

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

以下是Spring Proxying Mechanism的参考资料。

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

答案 1 :(得分:0)

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