Mi sono imbattuto in un caso in cui il proxy AOP creato utilizzando @Cacheable interrompe l'iniezione di dipendenza in Spring 3.1.1. Ecco il mio scenario:@ Interruzioni memorizzabili DependencyInjection
Ho un'interfaccia e una classe che implementano questa interfaccia utilizzando @Cacheable con il metodo implementato.
interfaccia Esempio:
public interface ImgService {
public byte[] getImage(String name);
}
attuazione Esempio:
public class ImgServiceImpl implements ImgService {
@Cacheable(cacheName = "someCache")
public byte[] getImage(String name){//TODO};
protected String someOtherMethod(){//};
}
devo anche classi di test JUnit - uno che inietta l'interfaccia ed un'attuazione:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:META-INF/spring.xml" })
public class ImgServiceTest {
@Inject
private ImgService;
}
e
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:META-INF/spring.xml" })
public class ImgServiceImplTest {
@Inject
private ImgServiceImpl;
}
L'iniezione di dipendenza per l'interfaccia funziona correttamente. Tuttavia, quando riesco a iniettare l'implementazione nella seconda classe di test, ottengo un valore "Iniezione delle dipendenze autowired non riuscite". Sono stato in grado di eseguire il debug e sembra che ClassUtils.isAssignableValue() compari erroneamente il tipo desiderato per la classe proxy. È chiamato da DefaultListableBeanFactory. Ciò che è ancora più strano è che se rimuovo l'annotazione @Cacheable dal metodo implementato e lo aggiungo ad un altro metodo protetto/privato, l'injection dependency funziona di nuovo bene. È un bug e quale sarebbe l'approccio corretto per gestire questa situazione?
Ecco un altro buon riferimento - http://blog.springsource.org/2012/05/23/understanding-proxy-usage-in-spring/ –