我偶然发现了使用@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;
}
接口的依赖注入工作正常。但是,当我在第二个测试类中注入实现时,我得到一个"Injection of autowired dependencies failed"。我能够对其进行调试,并且似乎ClassUtils.isAssignableValue()错误地将所需类型与代理类进行了比较。它由DefaultListableBeanFactory调用。更奇怪的是,如果我从实现的方法中删除 @Cacheable 注释并将其添加到其他一些受保护/私有方法中,依赖注入再次正常工作。这是一个错误吗?处理这种情况的正确方法是什么?