【发布时间】:2012-08-13 15:22:08
【问题描述】:
我偶然发现使用@Cacheable 创建的AOP 代理破坏了Spring 3.1.1 中的依赖注入。这是我的场景:
我有一个接口和一个实现这个接口的类,在实现的方法中使用@Cacheable。
示例界面:
public interface ImgService {
public byte[] getImage(String name);
}
示例实现:
public class ImgServiceImpl implements ImgService {
@Cacheable(cacheName = "someCache")
public byte[] getImage(String name){//TODO};
protected String someOtherMethod(){//};
}
我还必须对 JUnit 测试类 - 一个注入接口,一个注入实现:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:META-INF/spring.xml" })
public class ImgServiceTest {
@Inject
private ImgService;
}
和
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:META-INF/spring.xml" })
public class ImgServiceImplTest {
@Inject
private ImgServiceImpl;
}
接口的依赖注入工作正常。然而,当我在第二个测试类中注入实现时,我得到一个“自动装配依赖注入失败”。我能够对其进行调试,并且似乎 ClassUtils.isAssignableValue() 错误地将所需类型与代理类进行了比较。它由 DefaultListableBeanFactory 调用。更奇怪的是,如果我从实现的方法中删除 @Cacheable 注释并将其添加到其他一些受保护/私有方法中,依赖注入再次正常工作。这是一个错误吗?处理这种情况的正确方法是什么?
【问题讨论】:
-
这里还有一个很好的参考 - blog.springsource.org/2012/05/23/…
标签: java spring dependency-injection annotations proxy-classes