Support @Cache* as merged composed annotations
Prior to this commit, @Cacheable, @CacheEvict, @CachePut, and @Caching could be used to create custom stereotype annotations with hardcoded values for their attributes; however, it was not possible to create composed annotations with attribute overrides. This commit addresses this issue by refactoring SpringCacheAnnotationParser to use the newly introduced findAllMergedAnnotations() method in AnnotatedElementUtils. As a result, @Cacheable, @CacheEvict, @CachePut, and @Caching can now be used to create custom composed annotations with attribute overrides configured via @AliasFor. Issue: SPR-13475
This commit is contained in:
@@ -27,6 +27,7 @@ import org.springframework.cache.interceptor.CacheEvictOperation;
|
||||
import org.springframework.cache.interceptor.CacheOperation;
|
||||
import org.springframework.cache.interceptor.CachePutOperation;
|
||||
import org.springframework.cache.interceptor.CacheableOperation;
|
||||
import org.springframework.core.annotation.AnnotatedElementUtils;
|
||||
import org.springframework.core.annotation.AnnotationUtils;
|
||||
import org.springframework.util.ObjectUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
@@ -61,29 +62,29 @@ public class SpringCacheAnnotationParser implements CacheAnnotationParser, Seria
|
||||
protected Collection<CacheOperation> parseCacheAnnotations(DefaultCacheConfig cachingConfig, AnnotatedElement ae) {
|
||||
Collection<CacheOperation> ops = null;
|
||||
|
||||
Collection<Cacheable> cacheables = getAnnotations(ae, Cacheable.class);
|
||||
if (cacheables != null) {
|
||||
Collection<Cacheable> cacheables = AnnotatedElementUtils.findAllMergedAnnotations(ae, Cacheable.class);
|
||||
if (!cacheables.isEmpty()) {
|
||||
ops = lazyInit(ops);
|
||||
for (Cacheable cacheable : cacheables) {
|
||||
ops.add(parseCacheableAnnotation(ae, cachingConfig, cacheable));
|
||||
}
|
||||
}
|
||||
Collection<CacheEvict> evicts = getAnnotations(ae, CacheEvict.class);
|
||||
if (evicts != null) {
|
||||
Collection<CacheEvict> evicts = AnnotatedElementUtils.findAllMergedAnnotations(ae, CacheEvict.class);
|
||||
if (!evicts.isEmpty()) {
|
||||
ops = lazyInit(ops);
|
||||
for (CacheEvict evict : evicts) {
|
||||
ops.add(parseEvictAnnotation(ae, cachingConfig, evict));
|
||||
}
|
||||
}
|
||||
Collection<CachePut> puts = getAnnotations(ae, CachePut.class);
|
||||
if (puts != null) {
|
||||
Collection<CachePut> puts = AnnotatedElementUtils.findAllMergedAnnotations(ae, CachePut.class);
|
||||
if (!puts.isEmpty()) {
|
||||
ops = lazyInit(ops);
|
||||
for (CachePut put : puts) {
|
||||
ops.add(parsePutAnnotation(ae, cachingConfig, put));
|
||||
}
|
||||
}
|
||||
Collection<Caching> cachings = getAnnotations(ae, Caching.class);
|
||||
if (cachings != null) {
|
||||
Collection<Caching> cachings = AnnotatedElementUtils.findAllMergedAnnotations(ae, Caching.class);
|
||||
if (!cachings.isEmpty()) {
|
||||
ops = lazyInit(ops);
|
||||
for (Caching caching : cachings) {
|
||||
ops.addAll(parseCachingAnnotation(ae, cachingConfig, caching));
|
||||
@@ -198,26 +199,6 @@ public class SpringCacheAnnotationParser implements CacheAnnotationParser, Seria
|
||||
return new DefaultCacheConfig();
|
||||
}
|
||||
|
||||
private <A extends Annotation> Collection<A> getAnnotations(AnnotatedElement ae, Class<A> annotationType) {
|
||||
Collection<A> anns = new ArrayList<A>(1);
|
||||
|
||||
// look at raw annotation
|
||||
A ann = ae.getAnnotation(annotationType);
|
||||
if (ann != null) {
|
||||
anns.add(AnnotationUtils.synthesizeAnnotation(ann, ae));
|
||||
}
|
||||
|
||||
// scan meta-annotations
|
||||
for (Annotation metaAnn : ae.getAnnotations()) {
|
||||
ann = metaAnn.annotationType().getAnnotation(annotationType);
|
||||
if (ann != null) {
|
||||
anns.add(AnnotationUtils.synthesizeAnnotation(ann, ae));
|
||||
}
|
||||
}
|
||||
|
||||
return (!anns.isEmpty() ? anns : null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates the specified {@link CacheOperation}.
|
||||
* <p>Throws an {@link IllegalStateException} if the state of the operation is
|
||||
|
||||
Reference in New Issue
Block a user