actualización esta respuesta es obsoleta ahora, para Spring 3.2 y posteriores vea Tech Trip's answer, OP: no dude en marcarlo como aceptado.
No creo que es posible (aunque no es condicional desalojo caché en la primavera que se puede ejecutar después de la invocación del método con @CacheEvict
parámetro beforeInvocation establece en false, que es el valor por defecto) el examen de la clase CacheAspectSupport
muestra que el valor devuelto no se almacena en ningún lugar antes de la llamada inspectAfterCacheEvicts(ops.get(EVICT));
.
protected Object execute(Invoker invoker, Object target, Method method, Object[] args) {
// check whether aspect is enabled
// to cope with cases where the AJ is pulled in automatically
if (!this.initialized) {
return invoker.invoke();
}
// get backing class
Class<?> targetClass = AopProxyUtils.ultimateTargetClass(target);
if (targetClass == null && target != null) {
targetClass = target.getClass();
}
final Collection<CacheOperation> cacheOp = getCacheOperationSource().getCacheOperations(method, targetClass);
// analyze caching information
if (!CollectionUtils.isEmpty(cacheOp)) {
Map<String, Collection<CacheOperationContext>> ops = createOperationContext(cacheOp, method, args, target, targetClass);
// start with evictions
inspectBeforeCacheEvicts(ops.get(EVICT));
// follow up with cacheable
CacheStatus status = inspectCacheables(ops.get(CACHEABLE));
Object retVal = null;
Map<CacheOperationContext, Object> updates = inspectCacheUpdates(ops.get(UPDATE));
if (status != null) {
if (status.updateRequired) {
updates.putAll(status.cUpdates);
}
// return cached object
else {
return status.retVal;
}
}
retVal = invoker.invoke();
inspectAfterCacheEvicts(ops.get(EVICT));
if (!updates.isEmpty()) {
update(updates, retVal);
}
return retVal;
}
return invoker.invoke();
}
Hola, creo que debes aceptar la respuesta de Tech Trip porque es más relevante para la versión actual de Spring. –