अद्यतन इस जवाब अब पुरानी हो चुकी है, स्प्रिंग 3.2 और बाद के लिए टेक ट्रिप के answer देखें, ओपी: इसे स्वीकार्य के रूप में चिह्नित करने के लिए स्वतंत्र महसूस करें।
मुझे नहीं लगता कि यह संभव है (वहाँ भले ही वसंत में सशर्त कैश बेदखली कि गलत पर @CacheEvict
पैरामीटर के साथ विधि मंगलाचरण के बाद क्रियान्वित किया जा सकता beforeInvocation सेट है, जो डिफ़ॉल्ट मान है) की जांच CacheAspectSupport
वर्ग से पता चलता है लौटाया गया मूल्य 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();
}
स्रोत
2012-08-24 17:52:04
हाय, मुझे लगता है कि आपको टेक ट्रिप का उत्तर स्वीकार्य माना जाना चाहिए, क्योंकि यह वसंत के वर्तमान संस्करण के लिए अधिक प्रासंगिक है। –