Natknąłem się na przypadek, w którym proxy AOP utworzone przy użyciu @Cacheable zrywa wtrysk zależności wiosną 3.1.1. Oto mój scenariusz:@Przekładalne przerwy DependencyInjection
Mam interfejs i klasę implementującą ten interfejs przy użyciu @Cacheable w zaimplementowanej metodzie.
przykład interfejs:
public interface ImgService {
public byte[] getImage(String name);
}
Przykład realizacji:
public class ImgServiceImpl implements ImgService {
@Cacheable(cacheName = "someCache")
public byte[] getImage(String name){//TODO};
protected String someOtherMethod(){//};
}
również mieć klas testowych JUnit - jednej, która wtryskuje interfejsu i jedną realizację:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:META-INF/spring.xml" })
public class ImgServiceTest {
@Inject
private ImgService;
}
i
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:META-INF/spring.xml" })
public class ImgServiceImplTest {
@Inject
private ImgServiceImpl;
}
Wstrzyknięcie zależności interfejsu działa dobrze. Jednak, gdy dostanę wstrzykiwanie implementacji w drugiej klasie testowej, otrzymam "Injection of auticedred dependencies failed". Udało mi się to zdebugować i wydaje się, że ClassUtils.isAssignableValue() błędnie porównuje żądany typ z klasą proxy. Jest wywoływana przez DefaultListableBeanFactory. Jeszcze dziwniejsze jest to, że jeśli usunę adnotację @Cacheable z zaimplementowanej metody i dodaję ją do innej chronionej/prywatnej metody, wtrysk zależności znów działa dobrze. Czy to błąd i jakie byłoby właściwe podejście do rozwiązania tej sytuacji?
Oto jeden więcej dobre referencje - http://blog.springsource.org/2012/05/23/understanding-proxy-usage-in-spring/ –