提交 6f987a9c 编写于 作者: S Stephane Nicoll

Proper JCache metadata caching on non cache methods

Prior to this commit, the cache operation metadata cache was not
updated for a method not using the JCache annotations. This means
that every execution of said method was going through the process
of identifying if it was using the cache or not.

This commit adds a default placeholder identifying the absence of
metadata; this allows to flag such method as not having any metadata
at all.

Issue: SPR-12337
上级 24d77f32
......@@ -43,22 +43,34 @@ import org.springframework.util.ClassUtils;
public abstract class AbstractFallbackJCacheOperationSource
implements JCacheOperationSource {
/**
* Canonical value held in cache to indicate no caching attribute was
* found for this method and we don't need to look again.
*/
private final static Object NULL_CACHING_ATTRIBUTE = new Object();
protected final Log logger = LogFactory.getLog(getClass());
private final Map<Object, JCacheOperation<?>> cache =
new ConcurrentHashMap<Object, JCacheOperation<?>>(1024);
private final Map<Object, Object> cache =
new ConcurrentHashMap<Object, Object>(1024);
@Override
public JCacheOperation<?> getCacheOperation(Method method, Class<?> targetClass) {
// First, see if we have a cached value.
Object cacheKey = new MethodCacheKey(method, targetClass);
JCacheOperation<?> cached = this.cache.get(cacheKey);
Object cached = this.cache.get(cacheKey);
if (cached != null) {
return cached;
if (cached == NULL_CACHING_ATTRIBUTE) {
return null;
}
return (JCacheOperation<?>) cached;
}
else {
JCacheOperation<?> operation = computeCacheOperation(method, targetClass);
if (operation != null) {
if (operation == null) {
this.cache.put(cacheKey, NULL_CACHING_ATTRIBUTE);
}
else {
if (logger.isDebugEnabled()) {
logger.debug("Adding cacheable method '" + method.getName()
+ "' with operation: " + operation);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册