The problem is #root.targetClass.name is always "CrudService", to resolve the problem you have to :
1- Implement your own CacheKeyGenerator :
ApplicationContext.xml :
<bean id="refCacheKeyGenerator" class="x.y.cache.RefCacheKeyGenerator" />
<!-- cache definitions -->
<cache:advice id="cacheAdvice" key-generator="refCacheKeyGenerator" cache-manager="cacheManager">
<cache:caching cache="refs">
<cache:cacheable method="findById"/>
</cache:caching>
</cache:advice>
<aop:config>
<aop:advisor advice-ref="cacheAdvice" pointcut="execution(* x.y.*.service.reference.*.*(..))"/>
</aop:config>
Java :
public class RefCacheKeyGenerator implements org.springframework.cache.interceptor.KeyGenerator {
@Override
public Object generate(Object target, Method method, Object... params) {
final List<Object> key = new ArrayList<>();
key.add(method.getDeclaringClass().getName());
key.add(method.getName());
List<Class<?>> clazz = ClassUtils.getAllInterfaces(target.getClass());
if(CollectionUtils.isNotEmpty(clazz)){
for(Class<?> sClass : clazz){
if(AbstractReferenceService.class.isAssignableFrom(sClass)){
if(!AbstractReferenceService.class.equals(sClass)){
key.add(sClass.getName());
}
}
}
}
for (final Object o : params) {
key.add(o);
}
return key;
}
}
Test :
public class RefCacheTest extends AbstractTest {
@Autowired
private RefSituationService refSituationService;
@Autowired
private RefCivilityService refCivilityService;
@Autowired
private CacheManager cacheManager;
@Test
public void findById() {
Cache refCache = cacheManager.getCache(MyCache.REFS);
refCache.setStatisticsEnabled(true);
assertThat(refSituationService.findById(1L)).isInstanceOf(RefSituation.class);
assertThat(refSituationService.findById(1L)).isInstanceOf(RefSituation.class);
assertThat(refSituationService.findById(2L)).isInstanceOf(RefSituation.class);
assertThat(refCivilityService.findById(1L)).isInstanceOf(RefCivility.class);
assertThat(refCivilityService.findById(1L)).isInstanceOf(RefCivility.class);
assertThat(refCivilityService.findById(2L)).isInstanceOf(RefCivility.class);
System.out.println(refCache.getName() +" - "+ refCache.getStatistics().toString());
assertThat(refCache.getStatistics().getCacheHits()).isEqualTo(2);
assertThat(refCache.getSize()).isEqualTo(4);
}