我曾尝试使用@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>
谁能看到我出错的地方?
提前感谢任何建议。
- 詹姆斯
答案 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"
强制目标类代理策略)。