Add CaffeineCacheManager class conditions to LoadBalancerCacheAutoConfiguration. (#891)
This commit is contained in:
committed by
GitHub
parent
3493612ab4
commit
5839758365
@@ -25,12 +25,14 @@ import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
import org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.cache.CacheManager;
|
||||
import org.springframework.cache.caffeine.CaffeineCacheManager;
|
||||
import org.springframework.cache.interceptor.CacheAspectSupport;
|
||||
import org.springframework.cloud.client.loadbalancer.reactive.OnNoRibbonDefaultCondition;
|
||||
import org.springframework.cloud.loadbalancer.cache.CaffeineBasedLoadBalancerCacheManager;
|
||||
@@ -63,7 +65,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
public class LoadBalancerCacheAutoConfiguration {
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnMissingClass("com.github.benmanes.caffeine.cache.Caffeine")
|
||||
@Conditional(OnCaffeineCacheMissingCondition.class)
|
||||
protected static class LoadBalancerCacheManagerWarnConfiguration {
|
||||
|
||||
@Bean
|
||||
@@ -83,14 +85,14 @@ public class LoadBalancerCacheAutoConfiguration {
|
||||
if (LOG.isWarnEnabled()) {
|
||||
LOG.warn(
|
||||
"Spring Cloud LoadBalancer is currently working with the default cache. "
|
||||
+ "You can switch to using Caffeine cache, by adding it to the classpath.");
|
||||
+ "You can switch to using Caffeine cache, by adding it and org.springframework.cache.caffeine.CaffeineCacheManager to the classpath.");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnClass(Caffeine.class)
|
||||
@ConditionalOnClass({ Caffeine.class, CaffeineCacheManager.class })
|
||||
protected static class CaffeineLoadBalancerCacheManagerConfiguration {
|
||||
|
||||
@Bean(autowireCandidate = false)
|
||||
@@ -103,7 +105,7 @@ public class LoadBalancerCacheAutoConfiguration {
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnMissingClass("com.github.benmanes.caffeine.cache.Caffeine")
|
||||
@Conditional(OnCaffeineCacheMissingCondition.class)
|
||||
@ConditionalOnClass(ConcurrentMapWithTimedEviction.class)
|
||||
protected static class DefaultLoadBalancerCacheManagerConfiguration {
|
||||
|
||||
@@ -116,4 +118,22 @@ public class LoadBalancerCacheAutoConfiguration {
|
||||
|
||||
}
|
||||
|
||||
static final class OnCaffeineCacheMissingCondition extends AnyNestedCondition {
|
||||
|
||||
private OnCaffeineCacheMissingCondition() {
|
||||
super(ConfigurationPhase.REGISTER_BEAN);
|
||||
}
|
||||
|
||||
@ConditionalOnMissingClass("com.github.benmanes.caffeine.cache.Caffeine")
|
||||
static class CaffeineClassMissing {
|
||||
|
||||
}
|
||||
|
||||
@ConditionalOnMissingClass("org.springframework.cache.caffeine.CaffeineCacheManager")
|
||||
static class CaffeineCacheManagerClassMissing {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -130,6 +130,24 @@ class LoadBalancerCacheAutoConfigurationTests {
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldUseDefaultCacheIfCaffeineCacheManagerNotInClasspath() {
|
||||
ApplicationContextRunner contextRunner = noCaffeineCacheManagerRunner();
|
||||
|
||||
contextRunner.run(context -> {
|
||||
assertThat(context.getBean(
|
||||
LoadBalancerCacheAutoConfiguration.LoadBalancerCaffeineWarnLogger.class))
|
||||
.isNotNull();
|
||||
assertThat(context.getBeansOfType(CacheManager.class)).hasSize(1);
|
||||
assertThat(((CacheManager) context.getBean("defaultLoadBalancerCacheManager"))
|
||||
.getCacheNames()).hasSize(1);
|
||||
assertThat(context.getBean("defaultLoadBalancerCacheManager"))
|
||||
.isInstanceOf(DefaultLoadBalancerCacheManager.class);
|
||||
assertThat(((CacheManager) context.getBean("defaultLoadBalancerCacheManager"))
|
||||
.getCacheNames()).contains("CachingServiceInstanceListSupplierCache");
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void defaultLoadBalancerCacheShouldNotOverrideCacheTypeSetting() {
|
||||
ApplicationContextRunner contextRunner = noCaffeineRunner()
|
||||
@@ -190,6 +208,11 @@ class LoadBalancerCacheAutoConfigurationTests {
|
||||
.withClassLoader(new FilteredClassLoader(Caffeine.class));
|
||||
}
|
||||
|
||||
private ApplicationContextRunner noCaffeineCacheManagerRunner() {
|
||||
return baseApplicationRunner()
|
||||
.withClassLoader(new FilteredClassLoader(CaffeineCacheManager.class));
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@EnableCaching
|
||||
static class TestConfiguration {
|
||||
|
||||
Reference in New Issue
Block a user