Browse Source

Provide predetermined capacity for cache operation collections

Issue: SPR-17079
pull/1894/head
Juergen Hoeller 8 years ago
parent
commit
20c34cbb9b
  1. 5
      spring-context/src/main/java/org/springframework/cache/interceptor/AbstractCacheResolver.java
  2. 20
      spring-context/src/main/java/org/springframework/cache/interceptor/CacheAspectSupport.java

5
spring-context/src/main/java/org/springframework/cache/interceptor/AbstractCacheResolver.java vendored

@ -32,6 +32,7 @@ import org.springframework.util.Assert;
* invocation context. * invocation context.
* *
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Juergen Hoeller
* @since 4.1 * @since 4.1
*/ */
public abstract class AbstractCacheResolver implements CacheResolver, InitializingBean { public abstract class AbstractCacheResolver implements CacheResolver, InitializingBean {
@ -83,8 +84,7 @@ public abstract class AbstractCacheResolver implements CacheResolver, Initializi
if (cacheNames == null) { if (cacheNames == null) {
return Collections.emptyList(); return Collections.emptyList();
} }
else { Collection<Cache> result = new ArrayList<>(cacheNames.size());
Collection<Cache> result = new ArrayList<>();
for (String cacheName : cacheNames) { for (String cacheName : cacheNames) {
Cache cache = getCacheManager().getCache(cacheName); Cache cache = getCacheManager().getCache(cacheName);
if (cache == null) { if (cache == null) {
@ -95,7 +95,6 @@ public abstract class AbstractCacheResolver implements CacheResolver, Initializi
} }
return result; return result;
} }
}
/** /**
* Provide the name of the cache(s) to resolve against the current cache manager. * Provide the name of the cache(s) to resolve against the current cache manager.

20
spring-context/src/main/java/org/springframework/cache/interceptor/CacheAspectSupport.java vendored

@ -586,16 +586,16 @@ public abstract class CacheAspectSupport extends AbstractCacheInvoker
private class CacheOperationContexts { private class CacheOperationContexts {
private final MultiValueMap<Class<? extends CacheOperation>, CacheOperationContext> contexts = private final MultiValueMap<Class<? extends CacheOperation>, CacheOperationContext> contexts;
new LinkedMultiValueMap<>();
private final boolean sync; private final boolean sync;
public CacheOperationContexts(Collection<? extends CacheOperation> operations, Method method, public CacheOperationContexts(Collection<? extends CacheOperation> operations, Method method,
Object[] args, Object target, Class<?> targetClass) { Object[] args, Object target, Class<?> targetClass) {
for (CacheOperation operation : operations) { this.contexts = new LinkedMultiValueMap<>(operations.size());
this.contexts.add(operation.getClass(), getOperationContext(operation, method, args, target, targetClass)); for (CacheOperation op : operations) {
this.contexts.add(op.getClass(), getOperationContext(op, method, args, target, targetClass));
} }
this.sync = determineSyncFlag(method); this.sync = determineSyncFlag(method);
} }
@ -623,18 +623,22 @@ public abstract class CacheAspectSupport extends AbstractCacheInvoker
} }
if (syncEnabled) { if (syncEnabled) {
if (this.contexts.size() > 1) { if (this.contexts.size() > 1) {
throw new IllegalStateException("@Cacheable(sync=true) cannot be combined with other cache operations on '" + method + "'"); throw new IllegalStateException(
"@Cacheable(sync=true) cannot be combined with other cache operations on '" + method + "'");
} }
if (cacheOperationContexts.size() > 1) { if (cacheOperationContexts.size() > 1) {
throw new IllegalStateException("Only one @Cacheable(sync=true) entry is allowed on '" + method + "'"); throw new IllegalStateException(
"Only one @Cacheable(sync=true) entry is allowed on '" + method + "'");
} }
CacheOperationContext cacheOperationContext = cacheOperationContexts.iterator().next(); CacheOperationContext cacheOperationContext = cacheOperationContexts.iterator().next();
CacheableOperation operation = (CacheableOperation) cacheOperationContext.getOperation(); CacheableOperation operation = (CacheableOperation) cacheOperationContext.getOperation();
if (cacheOperationContext.getCaches().size() > 1) { if (cacheOperationContext.getCaches().size() > 1) {
throw new IllegalStateException("@Cacheable(sync=true) only allows a single cache on '" + operation + "'"); throw new IllegalStateException(
"@Cacheable(sync=true) only allows a single cache on '" + operation + "'");
} }
if (StringUtils.hasText(operation.getUnless())) { if (StringUtils.hasText(operation.getUnless())) {
throw new IllegalStateException("@Cacheable(sync=true) does not support unless attribute on '" + operation + "'"); throw new IllegalStateException(
"@Cacheable(sync=true) does not support unless attribute on '" + operation + "'");
} }
return true; return true;
} }

Loading…
Cancel
Save