Me encontré con un caso en el que el proxy AOP creado mediante @Cacheable rompe la inyección de dependencia en Spring 3.1.1. Aquí está mi escenario:@Cacheable breaks DependencyInjection
Tengo una interfaz y una clase que implementa esta interfaz usando @Cacheable en el método implementado.
Ejemplo interfaz:
public interface ImgService {
public byte[] getImage(String name);
}
ejemplo de implementación:
public class ImgServiceImpl implements ImgService {
@Cacheable(cacheName = "someCache")
public byte[] getImage(String name){//TODO};
protected String someOtherMethod(){//};
}
I también tienen que clases de prueba JUnit - uno que inyecta la interfaz y uno de la aplicación:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:META-INF/spring.xml" })
public class ImgServiceTest {
@Inject
private ImgService;
}
y
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:META-INF/spring.xml" })
public class ImgServiceImplTest {
@Inject
private ImgServiceImpl;
}
La inyección de dependencias para la interfaz funciona bien. Sin embargo, cuando llego a inyectar la implementación en la segunda clase de prueba, obtengo un "Falló la inyección de dependencias autoconectadas". Pude depurarlo y parece que ClassUtils.isAssignableValue() compara incorrectamente el tipo deseado con la clase de proxy. Se llama por DefaultListableBeanFactory. Lo que es aún más extraño es que si elimino la anotación @Cacheable del método implementado y lo agrego a algún otro método protegido/privado, la inyección de dependencia funciona bien de nuevo. ¿Es esto un error y cuál sería el enfoque correcto para manejar esta situación?
Aquí está uno más buena referencia - http://blog.springsource.org/2012/05/23/understanding-proxy-usage-in-spring/ –