Support @⁠CacheConfig("myCache") declarations for simplified config

The @⁠CacheConfig section of the reference manual provides an example
that declares @⁠CacheConfig("books").

However, unlike the @⁠Cacheable, @⁠CachePut, and @⁠CacheEvict
annotations, @⁠CacheConfig currently does not have a `value` alias for
the `cacheNames` attribute. Thus, the example in the reference manual
does not compile, and @⁠CacheConfig(cacheNames = "books") would be the
supported way to declare that.

The driving factor for this commit is therefore to provide a simplified
and consistent programming model for users that only need to define
default cache names at the type level (like in the existing example in
the reference manual).

To address that, this commit introduces a `value` alias for
`cacheNames` in @⁠CacheConfig.

See gh-35096
Closes gh-35152

(cherry picked from commit 6091453feb)
This commit is contained in:
Sam Brannen
2025-07-03 17:16:23 +02:00
parent 75b7f5efcf
commit d07ed31fed
8 changed files with 22 additions and 9 deletions
@@ -129,7 +129,7 @@ class CaffeineReactiveCachingTests {
}
@CacheConfig(cacheNames = "first")
@CacheConfig("first")
static class ReactiveCacheableService {
private final AtomicLong counter = new AtomicLong();
@@ -22,6 +22,8 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
/**
* {@code @CacheConfig} provides a mechanism for sharing common cache-related
* settings at the class level.
@@ -39,6 +41,15 @@ import java.lang.annotation.Target;
@Documented
public @interface CacheConfig {
/**
* Alias for {@link #cacheNames}.
* <p>Intended to be used when no other attributes are needed, for example:
* {@code @CacheConfig("books")}.
* @since 6.2.9
*/
@AliasFor("cacheNames")
String[] value() default {};
/**
* Names of the default caches to consider for caching operations defined
* in the annotated class.
@@ -47,7 +58,9 @@ public @interface CacheConfig {
* configured {@link #cacheResolver()} which typically delegates to
* {@link org.springframework.cache.CacheManager#getCache}.
* For further details see {@link Cacheable#cacheNames()}.
* @see #value
*/
@AliasFor("value")
String[] cacheNames() default {};
/**
@@ -443,7 +443,7 @@ class AnnotationCacheOperationSourceTests {
}
@CacheConfig(cacheNames = "myCache")
@CacheConfig("myCache")
private interface CacheConfigIfc {
@Cacheable
@@ -259,7 +259,7 @@ class ReactiveCachingTests {
}
@CacheConfig(cacheNames = "first")
@CacheConfig("first")
static class ReactiveCacheableService {
private final AtomicLong counter = new AtomicLong();
@@ -285,7 +285,7 @@ class ReactiveCachingTests {
}
@CacheConfig(cacheNames = "first")
@CacheConfig("first")
static class ReactiveSyncCacheableService {
private final AtomicLong counter = new AtomicLong();
@@ -307,7 +307,7 @@ class ReactiveCachingTests {
}
@CacheConfig(cacheNames = "first")
@CacheConfig("first")
static class ReactiveFailureCacheableService {
private final AtomicBoolean cacheFutureInvoked = new AtomicBoolean();
@@ -200,7 +200,7 @@ class EnableCachingIntegrationTests {
}
@CacheConfig(cacheNames = "testCache")
@CacheConfig("testCache")
static class FooServiceImpl implements FooService {
private final AtomicLong counter = new AtomicLong();
@@ -261,7 +261,7 @@ class CacheErrorHandlerTests {
}
@CacheConfig(cacheNames = "test")
@CacheConfig("test")
public static class SimpleService {
private AtomicLong counter = new AtomicLong();
@@ -121,7 +121,7 @@ class CachePutEvaluationTests {
}
@CacheConfig(cacheNames = "test")
@CacheConfig("test")
public static class SimpleService {
private AtomicLong counter = new AtomicLong();
@@ -206,7 +206,7 @@ class CacheResolverCustomizationTests {
}
@CacheConfig(cacheNames = "default")
@CacheConfig("default")
static class SimpleService {
private final AtomicLong counter = new AtomicLong();