更新此答案已过时,对于Spring 3.2及更高版本,请参阅Tech Trip的答案,OP:随时将其标记为已接受。
我认为这是不可能的(即使在Spring中有条件的Cache驱逐可以在方法调用之前将@CacheEvict
参数beforeInvocation设置为false,这是默认值也可以执行),检查CacheAspectSupport
类表明返回的值未存储在之前的inspectAfterCacheEvicts(ops.get(EVICT));
通话。
protected Object execute(Invoker invoker, Object target, Method method, Object[] args) {
if (!this.initialized) {
return invoker.invoke();
}
Class<?> targetClass = AopProxyUtils.ultimateTargetClass(target);
if (targetClass == null && target != null) {
targetClass = target.getClass();
}
final Collection<CacheOperation> cacheOp = getCacheOperationSource().getCacheOperations(method, targetClass);
if (!CollectionUtils.isEmpty(cacheOp)) {
Map<String, Collection<CacheOperationContext>> ops = createOperationContext(cacheOp, method, args, target, targetClass);
inspectBeforeCacheEvicts(ops.get(EVICT));
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);
}
else {
return status.retVal;
}
}
retVal = invoker.invoke();
inspectAfterCacheEvicts(ops.get(EVICT));
if (!updates.isEmpty()) {
update(updates, retVal);
}
return retVal;
}
return invoker.invoke();
}