diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheAutoConfiguration.java index 7f826fed05..52d0fe760e 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheAutoConfiguration.java @@ -66,7 +66,7 @@ import org.springframework.util.Assert; @EnableConfigurationProperties(CacheProperties.class) @AutoConfigureBefore(HibernateJpaAutoConfiguration.class) @AutoConfigureAfter({ HazelcastAutoConfiguration.class, RedisAutoConfiguration.class }) -@Import({ CacheManagerCustomizerInvoker.class, CacheConfigurationImportSelector.class }) +@Import({ CacheManagerCustomizers.class, CacheConfigurationImportSelector.class }) public class CacheAutoConfiguration { static final String VALIDATOR_BEAN_NAME = "cacheAutoConfigurationValidator"; diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheManagerCustomizer.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheManagerCustomizer.java index c3a53d4ba4..e8c08fd724 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheManagerCustomizer.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheManagerCustomizer.java @@ -22,16 +22,16 @@ import org.springframework.cache.CacheManager; * Callback interface that can be implemented by beans wishing to customize the cache * manager before it is fully initialized, in particular to tune its configuration. * - * @param The type of the {@link CacheManager} + * @param The type of the {@link CacheManager} * @author Stephane Nicoll * @since 1.3.3 */ -public interface CacheManagerCustomizer { +public interface CacheManagerCustomizer { /** * Customize the cache manager. * @param cacheManager the {@code CacheManager} to customize */ - void customize(C cacheManager); + void customize(T cacheManager); } diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheManagerCustomizerInvoker.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheManagerCustomizers.java similarity index 72% rename from spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheManagerCustomizerInvoker.java rename to spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheManagerCustomizers.java index 8c667a69e1..8ee8ff8a88 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheManagerCustomizerInvoker.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheManagerCustomizers.java @@ -17,9 +17,9 @@ package org.springframework.boot.autoconfigure.cache; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.Map; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactoryUtils; @@ -31,12 +31,12 @@ import org.springframework.core.GenericTypeResolver; import org.springframework.core.annotation.AnnotationAwareOrderComparator; /** - * Invoke the available {@link CacheManagerCustomizer} instances in the context for a + * Invokes the available {@link CacheManagerCustomizer} instances in the context for a * given {@link CacheManager}. * * @author Stephane Nicoll */ -class CacheManagerCustomizerInvoker implements ApplicationContextAware { +class CacheManagerCustomizers implements ApplicationContextAware { private ConfigurableApplicationContext applicationContext; @@ -45,14 +45,16 @@ class CacheManagerCustomizerInvoker implements ApplicationContextAware { * {@link CacheManagerCustomizer} beans able to handle the specified instance and * invoke {@link CacheManagerCustomizer#customize(CacheManager)} on them. * @param cacheManager the cache manager to customize + * @return the cache manager */ - public void customize(CacheManager cacheManager) { + public T customize(T cacheManager) { List> customizers = findCustomizers( cacheManager); AnnotationAwareOrderComparator.sort(customizers); for (CacheManagerCustomizer customizer : customizers) { customizer.customize(cacheManager); } + return cacheManager; } @SuppressWarnings({ "unchecked", "rawtypes" }) @@ -61,20 +63,28 @@ class CacheManagerCustomizerInvoker implements ApplicationContextAware { if (this.applicationContext == null) { return Collections.emptyList(); } - Map map = BeanFactoryUtils - .beansOfTypeIncludingAncestors(this.applicationContext.getBeanFactory(), - CacheManagerCustomizer.class); + Class cacheManagerClass = cacheManager.getClass(); List> customizers = new ArrayList>(); - for (CacheManagerCustomizer customizer : map.values()) { - Class target = GenericTypeResolver.resolveTypeArgument( - customizer.getClass(), CacheManagerCustomizer.class); - if (target == null || target.isAssignableFrom(cacheManager.getClass())) { + for (CacheManagerCustomizer customizer : getBeans(CacheManagerCustomizer.class)) { + if (canCustomize(customizer, cacheManagerClass)) { customizers.add(customizer); } } return customizers; } + private Collection getBeans(Class type) { + return BeanFactoryUtils.beansOfTypeIncludingAncestors( + this.applicationContext.getBeanFactory(), type).values(); + } + + private boolean canCustomize(CacheManagerCustomizer customizer, + Class cacheManagerClass) { + Class target = GenericTypeResolver.resolveTypeArgument(customizer.getClass(), + CacheManagerCustomizer.class); + return (target == null || target.isAssignableFrom(cacheManagerClass)); + } + @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/EhCacheCacheConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/EhCacheCacheConfiguration.java index acca8fe72a..ca4a0d34d0 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/EhCacheCacheConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/EhCacheCacheConfiguration.java @@ -49,13 +49,11 @@ class EhCacheCacheConfiguration { private CacheProperties cacheProperties; @Autowired - CacheManagerCustomizerInvoker customizerInvoker; + private CacheManagerCustomizers customizers; @Bean public EhCacheCacheManager cacheManager(CacheManager ehCacheCacheManager) { - EhCacheCacheManager cacheManager = new EhCacheCacheManager(ehCacheCacheManager); - this.customizerInvoker.customize(cacheManager); - return cacheManager; + return this.customizers.customize(new EhCacheCacheManager(ehCacheCacheManager)); } @Bean diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/GenericCacheConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/GenericCacheConfiguration.java index 052f3a55f4..ef26ae2d81 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/GenericCacheConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/GenericCacheConfiguration.java @@ -42,14 +42,13 @@ import org.springframework.context.annotation.Configuration; class GenericCacheConfiguration { @Autowired - CacheManagerCustomizerInvoker customizerInvoker; + private CacheManagerCustomizers customizers; @Bean public SimpleCacheManager cacheManager(Collection caches) { SimpleCacheManager cacheManager = new SimpleCacheManager(); cacheManager.setCaches(caches); - this.customizerInvoker.customize(cacheManager); - return cacheManager; + return this.customizers.customize(cacheManager); } } diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/GuavaCacheConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/GuavaCacheConfiguration.java index 5bb17c9ab0..15012ce9e8 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/GuavaCacheConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/GuavaCacheConfiguration.java @@ -49,7 +49,7 @@ class GuavaCacheConfiguration { private CacheProperties cacheProperties; @Autowired - CacheManagerCustomizerInvoker customizerInvoker; + private CacheManagerCustomizers customizers; @Autowired(required = false) private CacheBuilder cacheBuilder; @@ -67,8 +67,7 @@ class GuavaCacheConfiguration { if (!CollectionUtils.isEmpty(cacheNames)) { cacheManager.setCacheNames(cacheNames); } - this.customizerInvoker.customize(cacheManager); - return cacheManager; + return this.customizers.customize(cacheManager); } private GuavaCacheManager createCacheManager() { diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/HazelcastInstanceConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/HazelcastInstanceConfiguration.java index 819ac4dbea..84a018c73e 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/HazelcastInstanceConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/HazelcastInstanceConfiguration.java @@ -49,7 +49,7 @@ abstract class HazelcastInstanceConfiguration { private CacheProperties cacheProperties; @Autowired - CacheManagerCustomizerInvoker customizerInvoker; + private CacheManagerCustomizers customizers; @Bean public HazelcastCacheManager cacheManager( @@ -63,8 +63,7 @@ abstract class HazelcastInstanceConfiguration { } HazelcastCacheManager cacheManager = new HazelcastCacheManager( existingHazelcastInstance); - this.customizerInvoker.customize(cacheManager); - return cacheManager; + return this.customizers.customize(cacheManager); } } @@ -77,7 +76,7 @@ abstract class HazelcastInstanceConfiguration { private CacheProperties cacheProperties; @Autowired - CacheManagerCustomizerInvoker customizerInvoker; + private CacheManagerCustomizers customizers; @Bean public HazelcastInstance hazelcastInstance() throws IOException { @@ -93,8 +92,7 @@ abstract class HazelcastInstanceConfiguration { public HazelcastCacheManager cacheManager() throws IOException { HazelcastCacheManager cacheManager = new HazelcastCacheManager( hazelcastInstance()); - this.customizerInvoker.customize(cacheManager); - return cacheManager; + return this.customizers.customize(cacheManager); } } diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/InfinispanCacheConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/InfinispanCacheConfiguration.java index 555bb74524..9b95cc4217 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/InfinispanCacheConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/InfinispanCacheConfiguration.java @@ -52,7 +52,7 @@ public class InfinispanCacheConfiguration { private CacheProperties cacheProperties; @Autowired - CacheManagerCustomizerInvoker customizerInvoker; + private CacheManagerCustomizers customizers; @Autowired(required = false) private ConfigurationBuilder defaultConfigurationBuilder; @@ -62,8 +62,7 @@ public class InfinispanCacheConfiguration { EmbeddedCacheManager embeddedCacheManager) { SpringEmbeddedCacheManager cacheManager = new SpringEmbeddedCacheManager( embeddedCacheManager); - this.customizerInvoker.customize(cacheManager); - return cacheManager; + return this.customizers.customize(cacheManager); } @Bean(destroyMethod = "stop") diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/JCacheCacheConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/JCacheCacheConfiguration.java index 0d44a30caf..c253d5c5d5 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/JCacheCacheConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/JCacheCacheConfiguration.java @@ -64,7 +64,7 @@ class JCacheCacheConfiguration { private CacheProperties cacheProperties; @Autowired - CacheManagerCustomizerInvoker customizerInvoker; + private CacheManagerCustomizers customizers; @Autowired(required = false) private javax.cache.configuration.Configuration defaultCacheConfiguration; @@ -75,8 +75,7 @@ class JCacheCacheConfiguration { @Bean public JCacheCacheManager cacheManager(CacheManager jCacheCacheManager) { JCacheCacheManager cacheManager = new JCacheCacheManager(jCacheCacheManager); - this.customizerInvoker.customize(cacheManager); - return cacheManager; + return this.customizers.customize(cacheManager); } @Bean diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/RedisCacheConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/RedisCacheConfiguration.java index 16fa5dd672..4a052e5576 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/RedisCacheConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/RedisCacheConfiguration.java @@ -47,7 +47,7 @@ class RedisCacheConfiguration { private CacheProperties cacheProperties; @Autowired - CacheManagerCustomizerInvoker customizerInvoker; + private CacheManagerCustomizers customizerInvoker; @Bean public RedisCacheManager cacheManager(RedisTemplate redisTemplate) { @@ -57,8 +57,7 @@ class RedisCacheConfiguration { if (!cacheNames.isEmpty()) { cacheManager.setCacheNames(cacheNames); } - this.customizerInvoker.customize(cacheManager); - return cacheManager; + return this.customizerInvoker.customize(cacheManager); } } diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/SimpleCacheConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/SimpleCacheConfiguration.java index 419094a96a..d8c657170a 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/SimpleCacheConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/SimpleCacheConfiguration.java @@ -41,7 +41,7 @@ class SimpleCacheConfiguration { private CacheProperties cacheProperties; @Autowired - CacheManagerCustomizerInvoker customizerInvoker; + private CacheManagerCustomizers customizerInvoker; @Bean public ConcurrentMapCacheManager cacheManager() { @@ -50,8 +50,7 @@ class SimpleCacheConfiguration { if (!cacheNames.isEmpty()) { cacheManager.setCacheNames(cacheNames); } - this.customizerInvoker.customize(cacheManager); - return cacheManager; + return this.customizerInvoker.customize(cacheManager); } } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cache/CacheAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cache/CacheAutoConfigurationTests.java index 1c3a41872b..68f3ab23de 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cache/CacheAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cache/CacheAutoConfigurationTests.java @@ -454,8 +454,10 @@ public class CacheAutoConfigurationTests { load(DefaultCacheConfiguration.class, "spring.cache.type=jcache", "spring.cache.jcache.provider=" + cachingProviderFqn, "spring.cache.cacheNames[0]=foo", "spring.cache.cacheNames[1]=bar"); - JCacheCacheManager cacheManager = validateCacheManager(JCacheCacheManager.class); + JCacheCacheManager cacheManager = validateCacheManager( + JCacheCacheManager.class); assertThat(cacheManager.getCacheNames()).containsOnly("foo", "bar"); + assertThat(cacheManager.getCacheNames()).hasSize(2); } finally { Caching.getCachingProvider(cachingProviderFqn).close(); @@ -889,18 +891,19 @@ public class CacheAutoConfigurationTests { } - static abstract class CacheManagerTestCustomizer - implements CacheManagerCustomizer { + static abstract class CacheManagerTestCustomizer + implements CacheManagerCustomizer { - private C cacheManager; + private T cacheManager; @Override - public void customize(C cacheManager) { + public void customize(T cacheManager) { if (this.cacheManager != null) { throw new IllegalStateException("Customized invoked twice"); } this.cacheManager = cacheManager; } + } } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cache/CacheManagerCustomizerInvokerTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cache/CacheManagerCustomizersTests.java similarity index 95% rename from spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cache/CacheManagerCustomizerInvokerTests.java rename to spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cache/CacheManagerCustomizersTests.java index 1ec2f9c130..2fdf4c5a9b 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cache/CacheManagerCustomizerInvokerTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cache/CacheManagerCustomizersTests.java @@ -38,7 +38,7 @@ import static org.mockito.Mockito.verifyZeroInteractions; * * @author Stephane Nicoll */ -public class CacheManagerCustomizerInvokerTests { +public class CacheManagerCustomizersTests { private AnnotationConfigApplicationContext context; @@ -59,7 +59,7 @@ public class CacheManagerCustomizerInvokerTests { @Test public void customizeNoConfigurableApplicationContext() { - CacheManagerCustomizerInvoker invoker = new CacheManagerCustomizerInvoker(); + CacheManagerCustomizers invoker = new CacheManagerCustomizers(); ApplicationContext context = mock(ApplicationContext.class); invoker.setApplicationContext(context); invoker.customize(mock(CacheManager.class)); @@ -82,11 +82,14 @@ public class CacheManagerCustomizerInvokerTests { @Bean public CacheManagerCustomizer cacheManagerCustomizer() { return new CacheManagerCustomizer() { + @Override public void customize(ConcurrentMapCacheManager cacheManager) { cacheManager.setCacheNames(Arrays.asList("one", "two")); } + }; } + } } diff --git a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc index 7ed5749c00..d52a1a3fce 100644 --- a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc +++ b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc @@ -3280,6 +3280,7 @@ as you want and you can also order them as usual using `@Order` or `Ordered`. === + [[boot-features-caching-provider-generic]] ==== Generic Generic caching is used if the context defines _at least_ one