From 08972eff9b696fbb7089de1dc26a28979e96c71a Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 28 Oct 2016 23:32:55 +0200 Subject: [PATCH] Local merged annotation lookup in SpringCacheAnnotationParser Issue: SPR-14781 Issue: SPR-14801 --- .../SpringCacheAnnotationParser.java | 8 ++-- .../AnnotationCacheOperationSourceTests.java | 46 +++++++++++++++++-- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/spring-context/src/main/java/org/springframework/cache/annotation/SpringCacheAnnotationParser.java b/spring-context/src/main/java/org/springframework/cache/annotation/SpringCacheAnnotationParser.java index 544710d0d0..b5bba3a8e9 100644 --- a/spring-context/src/main/java/org/springframework/cache/annotation/SpringCacheAnnotationParser.java +++ b/spring-context/src/main/java/org/springframework/cache/annotation/SpringCacheAnnotationParser.java @@ -62,28 +62,28 @@ public class SpringCacheAnnotationParser implements CacheAnnotationParser, Seria protected Collection parseCacheAnnotations(DefaultCacheConfig cachingConfig, AnnotatedElement ae) { Collection ops = null; - Collection cacheables = AnnotatedElementUtils.findAllMergedAnnotations(ae, Cacheable.class); + Collection cacheables = AnnotatedElementUtils.getAllMergedAnnotations(ae, Cacheable.class); if (!cacheables.isEmpty()) { ops = lazyInit(ops); for (Cacheable cacheable : cacheables) { ops.add(parseCacheableAnnotation(ae, cachingConfig, cacheable)); } } - Collection evicts = AnnotatedElementUtils.findAllMergedAnnotations(ae, CacheEvict.class); + Collection evicts = AnnotatedElementUtils.getAllMergedAnnotations(ae, CacheEvict.class); if (!evicts.isEmpty()) { ops = lazyInit(ops); for (CacheEvict evict : evicts) { ops.add(parseEvictAnnotation(ae, cachingConfig, evict)); } } - Collection puts = AnnotatedElementUtils.findAllMergedAnnotations(ae, CachePut.class); + Collection puts = AnnotatedElementUtils.getAllMergedAnnotations(ae, CachePut.class); if (!puts.isEmpty()) { ops = lazyInit(ops); for (CachePut put : puts) { ops.add(parsePutAnnotation(ae, cachingConfig, put)); } } - Collection cachings = AnnotatedElementUtils.findAllMergedAnnotations(ae, Caching.class); + Collection cachings = AnnotatedElementUtils.getAllMergedAnnotations(ae, Caching.class); if (!cachings.isEmpty()) { ops = lazyInit(ops); for (Caching caching : cachings) { diff --git a/spring-context/src/test/java/org/springframework/cache/annotation/AnnotationCacheOperationSourceTests.java b/spring-context/src/test/java/org/springframework/cache/annotation/AnnotationCacheOperationSourceTests.java index 19e800ee97..b9d9baff49 100644 --- a/spring-context/src/test/java/org/springframework/cache/annotation/AnnotationCacheOperationSourceTests.java +++ b/spring-context/src/test/java/org/springframework/cache/annotation/AnnotationCacheOperationSourceTests.java @@ -244,6 +244,22 @@ public class AnnotationCacheOperationSourceTests { assertSharedConfig(cacheOperation, "", "", "", "myCache"); } + @Test + public void cacheConfigFromInterface() { + assertNull(getOps(InterfaceCacheConfig.class, "interfaceCacheConfig")); + Collection ops = getOps(CacheConfigIfc.class, "interfaceCacheConfig"); + CacheOperation cacheOperation = ops.iterator().next(); + assertSharedConfig(cacheOperation, "", "", "", "myCache"); + } + + @Test + public void cacheAnnotationOverride() { + Collection ops = getOps(InterfaceCacheConfig.class, "interfaceCacheableOverride"); + assertSame(1, ops.size()); + CacheOperation cacheOperation = ops.iterator().next(); + assertTrue(cacheOperation instanceof CacheableOperation); + } + @Test public void partialClassLevelWithCustomCacheManager() { Collection ops = getOps(AnnotatedClassWithSomeDefault.class, "methodLevelCacheManager", 1); @@ -430,7 +446,7 @@ public class AnnotationCacheOperationSourceTests { @CacheConfigFoo - @CacheConfig(cacheNames = "myCache") // multiple sources + @CacheConfig(cacheNames = "myCache") // multiple sources private static class MultipleCacheConfig { @Cacheable @@ -439,6 +455,30 @@ public class AnnotationCacheOperationSourceTests { } + @CacheConfig(cacheNames = "myCache") + private interface CacheConfigIfc { + + @Cacheable + void interfaceCacheConfig(); + + @CachePut + void interfaceCacheableOverride(); + } + + + private static class InterfaceCacheConfig implements CacheConfigIfc { + + @Override + public void interfaceCacheConfig() { + } + + @Override + @Cacheable + public void interfaceCacheableOverride() { + } + } + + @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Cacheable("foo") @@ -491,7 +531,7 @@ public class AnnotationCacheOperationSourceTests { @Retention(RetentionPolicy.RUNTIME) - @Target({ ElementType.METHOD, ElementType.TYPE }) + @Target({ElementType.METHOD, ElementType.TYPE}) @Cacheable(cacheNames = "shadowed cache name", key = "shadowed key") @interface ComposedCacheable { @@ -507,7 +547,7 @@ public class AnnotationCacheOperationSourceTests { @Retention(RetentionPolicy.RUNTIME) - @Target({ ElementType.METHOD, ElementType.TYPE }) + @Target({ElementType.METHOD, ElementType.TYPE}) @CacheEvict(cacheNames = "shadowed cache name", key = "shadowed key") @interface ComposedCacheEvict {