diff --git a/build.gradle b/build.gradle index 59592e110c7..3fad5a7be8c 100644 --- a/build.gradle +++ b/build.gradle @@ -43,7 +43,6 @@ configure(allprojects) { project -> ext.freemarkerVersion = "2.3.23" ext.groovyVersion = "2.4.7" ext.gsonVersion = "2.7" - ext.guavaVersion = "19.0" ext.hamcrestVersion = "1.3" ext.hibernate5Version = "5.2.1.Final" ext.hibval5Version = "5.2.4.Final" @@ -612,7 +611,6 @@ project("spring-context-support") { optional(project(":spring-tx")) // for Quartz support optional("javax.mail:javax.mail-api:${javamailVersion}") optional("javax.cache:cache-api:1.0.0") - optional("com.google.guava:guava:${guavaVersion}") optional("com.github.ben-manes.caffeine:caffeine:${caffeineVersion}") optional("net.sf.ehcache:ehcache:${ehcacheVersion}") optional("org.quartz-scheduler:quartz:2.2.3") diff --git a/spring-context-support/src/main/java/org/springframework/cache/guava/GuavaCache.java b/spring-context-support/src/main/java/org/springframework/cache/guava/GuavaCache.java deleted file mode 100644 index b9900c246b9..00000000000 --- a/spring-context-support/src/main/java/org/springframework/cache/guava/GuavaCache.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright 2002-2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cache.guava; - -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; - -import com.google.common.cache.LoadingCache; -import com.google.common.util.concurrent.UncheckedExecutionException; - -import org.springframework.cache.support.AbstractValueAdaptingCache; -import org.springframework.util.Assert; - -/** - * Spring {@link org.springframework.cache.Cache} adapter implementation - * on top of a Guava {@link com.google.common.cache.Cache} instance. - * - *

Requires Google Guava 12.0 or higher. - * - * @author Juergen Hoeller - * @author Stephane Nicoll - * @since 4.0 - */ -public class GuavaCache extends AbstractValueAdaptingCache { - - private final String name; - - private final com.google.common.cache.Cache cache; - - - /** - * Create a {@link GuavaCache} instance with the specified name and the - * given internal {@link com.google.common.cache.Cache} to use. - * @param name the name of the cache - * @param cache the backing Guava Cache instance - */ - public GuavaCache(String name, com.google.common.cache.Cache cache) { - this(name, cache, true); - } - - /** - * Create a {@link GuavaCache} instance with the specified name and the - * given internal {@link com.google.common.cache.Cache} to use. - * @param name the name of the cache - * @param cache the backing Guava Cache instance - * @param allowNullValues whether to accept and convert {@code null} - * values for this cache - */ - public GuavaCache(String name, com.google.common.cache.Cache cache, boolean allowNullValues) { - super(allowNullValues); - Assert.notNull(name, "Name must not be null"); - Assert.notNull(cache, "Cache must not be null"); - this.name = name; - this.cache = cache; - } - - - @Override - public final String getName() { - return this.name; - } - - @Override - public final com.google.common.cache.Cache getNativeCache() { - return this.cache; - } - - @Override - public ValueWrapper get(Object key) { - if (this.cache instanceof LoadingCache) { - try { - Object value = ((LoadingCache) this.cache).get(key); - return toValueWrapper(value); - } - catch (ExecutionException ex) { - throw new UncheckedExecutionException(ex.getMessage(), ex); - } - } - return super.get(key); - } - - @SuppressWarnings("unchecked") - @Override - public T get(Object key, final Callable valueLoader) { - try { - return (T) fromStoreValue(this.cache.get(key, new Callable() { - @Override - public Object call() throws Exception { - return toStoreValue(valueLoader.call()); - } - })); - } - catch (ExecutionException ex) { - throw new ValueRetrievalException(key, valueLoader, ex.getCause()); - } - catch (UncheckedExecutionException ex) { - throw new ValueRetrievalException(key, valueLoader, ex.getCause()); - } - } - - @Override - protected Object lookup(Object key) { - return this.cache.getIfPresent(key); - } - - @Override - public void put(Object key, Object value) { - this.cache.put(key, toStoreValue(value)); - } - - @Override - public ValueWrapper putIfAbsent(Object key, final Object value) { - try { - PutIfAbsentCallable callable = new PutIfAbsentCallable(value); - Object result = this.cache.get(key, callable); - return (callable.called ? null : toValueWrapper(result)); - } - catch (ExecutionException ex) { - throw new IllegalStateException(ex); - } - } - - @Override - public void evict(Object key) { - this.cache.invalidate(key); - } - - @Override - public void clear() { - this.cache.invalidateAll(); - } - - - private class PutIfAbsentCallable implements Callable { - - private final Object value; - - private boolean called; - - public PutIfAbsentCallable(Object value) { - this.value = value; - } - - @Override - public Object call() throws Exception { - this.called = true; - return toStoreValue(this.value); - } - } - -} diff --git a/spring-context-support/src/main/java/org/springframework/cache/guava/GuavaCacheManager.java b/spring-context-support/src/main/java/org/springframework/cache/guava/GuavaCacheManager.java deleted file mode 100644 index b27f86def97..00000000000 --- a/spring-context-support/src/main/java/org/springframework/cache/guava/GuavaCacheManager.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright 2002-2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cache.guava; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheBuilderSpec; -import com.google.common.cache.CacheLoader; - -import org.springframework.cache.Cache; -import org.springframework.cache.CacheManager; -import org.springframework.util.Assert; -import org.springframework.util.ObjectUtils; - -/** - * {@link CacheManager} implementation that lazily builds {@link GuavaCache} - * instances for each {@link #getCache} request. Also supports a 'static' mode - * where the set of cache names is pre-defined through {@link #setCacheNames}, - * with no dynamic creation of further cache regions at runtime. - * - *

The configuration of the underlying cache can be fine-tuned through a - * Guava {@link CacheBuilder} or {@link CacheBuilderSpec}, passed into this - * CacheManager through {@link #setCacheBuilder}/{@link #setCacheBuilderSpec}. - * A {@link CacheBuilderSpec}-compliant expression value can also be applied - * via the {@link #setCacheSpecification "cacheSpecification"} bean property. - * - *

Requires Google Guava 12.0 or higher. - * - * @author Juergen Hoeller - * @author Stephane Nicoll - * @since 4.0 - * @see GuavaCache - */ -public class GuavaCacheManager implements CacheManager { - - private final ConcurrentMap cacheMap = new ConcurrentHashMap<>(16); - - private boolean dynamic = true; - - private CacheBuilder cacheBuilder = CacheBuilder.newBuilder(); - - private CacheLoader cacheLoader; - - private boolean allowNullValues = true; - - - /** - * Construct a dynamic GuavaCacheManager, - * lazily creating cache instances as they are being requested. - */ - public GuavaCacheManager() { - } - - /** - * Construct a static GuavaCacheManager, - * managing caches for the specified cache names only. - */ - public GuavaCacheManager(String... cacheNames) { - setCacheNames(Arrays.asList(cacheNames)); - } - - - /** - * Specify the set of cache names for this CacheManager's 'static' mode. - *

The number of caches and their names will be fixed after a call to this method, - * with no creation of further cache regions at runtime. - *

Calling this with a {@code null} collection argument resets the - * mode to 'dynamic', allowing for further creation of caches again. - */ - public void setCacheNames(Collection cacheNames) { - if (cacheNames != null) { - for (String name : cacheNames) { - this.cacheMap.put(name, createGuavaCache(name)); - } - this.dynamic = false; - } - else { - this.dynamic = true; - } - } - - /** - * Set the Guava CacheBuilder to use for building each individual - * {@link GuavaCache} instance. - * @see #createNativeGuavaCache - * @see com.google.common.cache.CacheBuilder#build() - */ - public void setCacheBuilder(CacheBuilder cacheBuilder) { - Assert.notNull(cacheBuilder, "CacheBuilder must not be null"); - doSetCacheBuilder(cacheBuilder); - } - - /** - * Set the Guava CacheBuilderSpec to use for building each individual - * {@link GuavaCache} instance. - * @see #createNativeGuavaCache - * @see com.google.common.cache.CacheBuilder#from(CacheBuilderSpec) - */ - public void setCacheBuilderSpec(CacheBuilderSpec cacheBuilderSpec) { - doSetCacheBuilder(CacheBuilder.from(cacheBuilderSpec)); - } - - /** - * Set the Guava cache specification String to use for building each - * individual {@link GuavaCache} instance. The given value needs to - * comply with Guava's {@link CacheBuilderSpec} (see its javadoc). - * @see #createNativeGuavaCache - * @see com.google.common.cache.CacheBuilder#from(String) - */ - public void setCacheSpecification(String cacheSpecification) { - doSetCacheBuilder(CacheBuilder.from(cacheSpecification)); - } - - /** - * Set the Guava CacheLoader to use for building each individual - * {@link GuavaCache} instance, turning it into a LoadingCache. - * @see #createNativeGuavaCache - * @see com.google.common.cache.CacheBuilder#build(CacheLoader) - * @see com.google.common.cache.LoadingCache - */ - public void setCacheLoader(CacheLoader cacheLoader) { - if (!ObjectUtils.nullSafeEquals(this.cacheLoader, cacheLoader)) { - this.cacheLoader = cacheLoader; - refreshKnownCaches(); - } - } - - /** - * Specify whether to accept and convert {@code null} values for all caches - * in this cache manager. - *

Default is "true", despite Guava itself not supporting {@code null} values. - * An internal holder object will be used to store user-level {@code null}s. - */ - public void setAllowNullValues(boolean allowNullValues) { - if (this.allowNullValues != allowNullValues) { - this.allowNullValues = allowNullValues; - refreshKnownCaches(); - } - } - - /** - * Return whether this cache manager accepts and converts {@code null} values - * for all of its caches. - */ - public boolean isAllowNullValues() { - return this.allowNullValues; - } - - - @Override - public Collection getCacheNames() { - return Collections.unmodifiableSet(this.cacheMap.keySet()); - } - - @Override - public Cache getCache(String name) { - Cache cache = this.cacheMap.get(name); - if (cache == null && this.dynamic) { - synchronized (this.cacheMap) { - cache = this.cacheMap.get(name); - if (cache == null) { - cache = createGuavaCache(name); - this.cacheMap.put(name, cache); - } - } - } - return cache; - } - - /** - * Create a new GuavaCache instance for the specified cache name. - * @param name the name of the cache - * @return the Spring GuavaCache adapter (or a decorator thereof) - */ - protected Cache createGuavaCache(String name) { - return new GuavaCache(name, createNativeGuavaCache(name), isAllowNullValues()); - } - - /** - * Create a native Guava Cache instance for the specified cache name. - * @param name the name of the cache - * @return the native Guava Cache instance - */ - protected com.google.common.cache.Cache createNativeGuavaCache(String name) { - if (this.cacheLoader != null) { - return this.cacheBuilder.build(this.cacheLoader); - } - else { - return this.cacheBuilder.build(); - } - } - - private void doSetCacheBuilder(CacheBuilder cacheBuilder) { - if (!ObjectUtils.nullSafeEquals(this.cacheBuilder, cacheBuilder)) { - this.cacheBuilder = cacheBuilder; - refreshKnownCaches(); - } - } - - /** - * Create the known caches again with the current state of this manager. - */ - private void refreshKnownCaches() { - for (Map.Entry entry : this.cacheMap.entrySet()) { - entry.setValue(createGuavaCache(entry.getKey())); - } - } - -} diff --git a/spring-context-support/src/main/java/org/springframework/cache/guava/package-info.java b/spring-context-support/src/main/java/org/springframework/cache/guava/package-info.java deleted file mode 100644 index 6f892820a98..00000000000 --- a/spring-context-support/src/main/java/org/springframework/cache/guava/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Support classes for the open source cache in Google's - * Guava library, - * allowing to set up Guava caches within Spring's cache abstraction. - */ -package org.springframework.cache.guava; diff --git a/spring-context-support/src/test/java/org/springframework/cache/guava/GuavaCacheManagerTests.java b/spring-context-support/src/test/java/org/springframework/cache/guava/GuavaCacheManagerTests.java deleted file mode 100644 index 0f7f70beaa6..00000000000 --- a/spring-context-support/src/test/java/org/springframework/cache/guava/GuavaCacheManagerTests.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright 2002-2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cache.guava; - -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.util.concurrent.UncheckedExecutionException; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; - -import org.springframework.cache.Cache; -import org.springframework.cache.CacheManager; - -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; - -/** - * @author Juergen Hoeller - * @author Stephane Nicoll - */ -public class GuavaCacheManagerTests { - - @Rule - public final ExpectedException thrown = ExpectedException.none(); - - @Test - public void testDynamicMode() { - CacheManager cm = new GuavaCacheManager(); - Cache cache1 = cm.getCache("c1"); - assertTrue(cache1 instanceof GuavaCache); - Cache cache1again = cm.getCache("c1"); - assertSame(cache1again, cache1); - Cache cache2 = cm.getCache("c2"); - assertTrue(cache2 instanceof GuavaCache); - Cache cache2again = cm.getCache("c2"); - assertSame(cache2again, cache2); - Cache cache3 = cm.getCache("c3"); - assertTrue(cache3 instanceof GuavaCache); - Cache cache3again = cm.getCache("c3"); - assertSame(cache3again, cache3); - - cache1.put("key1", "value1"); - assertEquals("value1", cache1.get("key1").get()); - cache1.put("key2", 2); - assertEquals(2, cache1.get("key2").get()); - cache1.put("key3", null); - assertNull(cache1.get("key3").get()); - cache1.evict("key3"); - assertNull(cache1.get("key3")); - } - - @Test - public void testStaticMode() { - GuavaCacheManager cm = new GuavaCacheManager("c1", "c2"); - Cache cache1 = cm.getCache("c1"); - assertTrue(cache1 instanceof GuavaCache); - Cache cache1again = cm.getCache("c1"); - assertSame(cache1again, cache1); - Cache cache2 = cm.getCache("c2"); - assertTrue(cache2 instanceof GuavaCache); - Cache cache2again = cm.getCache("c2"); - assertSame(cache2again, cache2); - Cache cache3 = cm.getCache("c3"); - assertNull(cache3); - - cache1.put("key1", "value1"); - assertEquals("value1", cache1.get("key1").get()); - cache1.put("key2", 2); - assertEquals(2, cache1.get("key2").get()); - cache1.put("key3", null); - assertNull(cache1.get("key3").get()); - cache1.evict("key3"); - assertNull(cache1.get("key3")); - - cm.setAllowNullValues(false); - Cache cache1x = cm.getCache("c1"); - assertTrue(cache1x instanceof GuavaCache); - assertTrue(cache1x != cache1); - Cache cache2x = cm.getCache("c2"); - assertTrue(cache2x instanceof GuavaCache); - assertTrue(cache2x != cache2); - Cache cache3x = cm.getCache("c3"); - assertNull(cache3x); - - cache1x.put("key1", "value1"); - assertEquals("value1", cache1x.get("key1").get()); - cache1x.put("key2", 2); - assertEquals(2, cache1x.get("key2").get()); - try { - cache1x.put("key3", null); - fail("Should have thrown NullPointerException"); - } - catch (NullPointerException ex) { - // expected - } - - cm.setAllowNullValues(true); - Cache cache1y = cm.getCache("c1"); - - cache1y.put("key3", null); - assertNull(cache1y.get("key3").get()); - cache1y.evict("key3"); - assertNull(cache1y.get("key3")); - } - - @Test - public void changeCacheSpecificationRecreateCache() { - GuavaCacheManager cm = new GuavaCacheManager("c1"); - Cache cache1 = cm.getCache("c1"); - - CacheBuilder cacheBuilder = CacheBuilder.newBuilder().maximumSize(10); - cm.setCacheBuilder(cacheBuilder); - Cache cache1x = cm.getCache("c1"); - assertTrue(cache1x != cache1); - - cm.setCacheBuilder(cacheBuilder); // Set same instance - Cache cache1xx = cm.getCache("c1"); - assertSame(cache1x, cache1xx); - } - - @Test - public void changeCacheLoaderRecreateCache() { - GuavaCacheManager cm = new GuavaCacheManager("c1"); - Cache cache1 = cm.getCache("c1"); - - CacheLoader loader = mockCacheLoader(); - cm.setCacheLoader(loader); - Cache cache1x = cm.getCache("c1"); - assertTrue(cache1x != cache1); - - cm.setCacheLoader(loader); // Set same instance - Cache cache1xx = cm.getCache("c1"); - assertSame(cache1x, cache1xx); - } - - @Test - public void setCacheNameNullRestoreDynamicMode() { - GuavaCacheManager cm = new GuavaCacheManager("c1"); - assertNull(cm.getCache("someCache")); - cm.setCacheNames(null); - assertNotNull(cm.getCache("someCache")); - } - - @Test - public void cacheLoaderUseLoadingCache() { - GuavaCacheManager cm = new GuavaCacheManager("c1"); - cm.setCacheLoader(new CacheLoader() { - @Override - public Object load(Object key) throws Exception { - if ("ping".equals(key)) { - return "pong"; - } - throw new IllegalArgumentException("I only know ping"); - } - }); - Cache cache1 = cm.getCache("c1"); - Cache.ValueWrapper value = cache1.get("ping"); - assertNotNull(value); - assertEquals("pong", value.get()); - - thrown.expect(UncheckedExecutionException.class); - thrown.expectMessage("I only know ping"); - assertNull(cache1.get("foo")); - } - - @SuppressWarnings("unchecked") - private CacheLoader mockCacheLoader() { - return mock(CacheLoader.class); - } - -} diff --git a/spring-context-support/src/test/java/org/springframework/cache/guava/GuavaCacheTests.java b/spring-context-support/src/test/java/org/springframework/cache/guava/GuavaCacheTests.java deleted file mode 100644 index d50213c001e..00000000000 --- a/spring-context-support/src/test/java/org/springframework/cache/guava/GuavaCacheTests.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2002-2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cache.guava; - -import com.google.common.cache.CacheBuilder; -import org.junit.Before; -import org.junit.Test; - -import org.springframework.cache.AbstractCacheTests; -import org.springframework.cache.Cache; - -import static org.junit.Assert.*; - -/** - * @author Stephane Nicoll - */ -public class GuavaCacheTests extends AbstractCacheTests { - - private com.google.common.cache.Cache nativeCache; - private GuavaCache cache; - - @Before - public void setUp() { - nativeCache = CacheBuilder.newBuilder().build(); - cache = new GuavaCache(CACHE_NAME, nativeCache); - } - - @Override - protected GuavaCache getCache() { - return cache; - } - - @Override - protected Object getNativeCache() { - return nativeCache; - } - - @Test - public void putIfAbsentNullValue() throws Exception { - GuavaCache cache = getCache(); - - Object key = new Object(); - Object value = null; - - assertNull(cache.get(key)); - assertNull(cache.putIfAbsent(key, value)); - assertEquals(value, cache.get(key).get()); - Cache.ValueWrapper wrapper = cache.putIfAbsent(key, "anotherValue"); - assertNotNull(wrapper); // A value is set but is 'null' - assertEquals(null, wrapper.get()); - assertEquals(value, cache.get(key).get()); // not changed - } - -} diff --git a/spring-context/src/main/java/org/springframework/cache/concurrent/ConcurrentMapCacheManager.java b/spring-context/src/main/java/org/springframework/cache/concurrent/ConcurrentMapCacheManager.java index f8314a2ad45..ad33fc4c874 100644 --- a/spring-context/src/main/java/org/springframework/cache/concurrent/ConcurrentMapCacheManager.java +++ b/spring-context/src/main/java/org/springframework/cache/concurrent/ConcurrentMapCacheManager.java @@ -39,8 +39,7 @@ import org.springframework.core.serializer.support.SerializationDelegate; * caching scenarios. For advanced local caching needs, consider * {@link org.springframework.cache.jcache.JCacheCacheManager}, * {@link org.springframework.cache.ehcache.EhCacheCacheManager}, - * {@link org.springframework.cache.caffeine.CaffeineCacheManager} or - * {@link org.springframework.cache.guava.GuavaCacheManager}. + * {@link org.springframework.cache.caffeine.CaffeineCacheManager}. * * @author Juergen Hoeller * @since 3.1 diff --git a/spring-expression/src/test/java/org/springframework/expression/spel/SpelReproTests.java b/spring-expression/src/test/java/org/springframework/expression/spel/SpelReproTests.java index b080a57f431..e05b86e30eb 100644 --- a/spring-expression/src/test/java/org/springframework/expression/spel/SpelReproTests.java +++ b/spring-expression/src/test/java/org/springframework/expression/spel/SpelReproTests.java @@ -1905,7 +1905,7 @@ public class SpelReproTests extends AbstractExpressionTests { StandardEvaluationContext sec = new StandardEvaluationContext(); sec.setVariable("iterable", Collections.emptyList()); SpelExpressionParser parser = new SpelExpressionParser(); - Expression expression = parser.parseExpression("T(org.springframework.expression.spel.SpelReproTests.GuavaLists).newArrayList(#iterable)"); + Expression expression = parser.parseExpression("T(org.springframework.expression.spel.SpelReproTests.FooLists).newArrayList(#iterable)"); assertTrue(expression.getValue(sec) instanceof ArrayList); } @@ -2408,7 +2408,7 @@ public class SpelReproTests extends AbstractExpressionTests { } - public static class GuavaLists { + public static class FooLists { public static List newArrayList(Iterable iterable) { return new ArrayList<>(); diff --git a/src/asciidoc/integration.adoc b/src/asciidoc/integration.adoc index a6ed72d8206..5c83a26b76e 100644 --- a/src/asciidoc/integration.adoc +++ b/src/asciidoc/integration.adoc @@ -8063,10 +8063,9 @@ materialized by the `org.springframework.cache.Cache` and There are <> of that abstraction available out of the box: JDK `java.util.concurrent.ConcurrentMap` based caches, http://ehcache.org/[EhCache], Gemfire cache, -https://github.com/ben-manes/caffeine/wiki[Caffeine], -https://code.google.com/p/guava-libraries/wiki/CachesExplained[Guava caches] and -JSR-107 compliant caches. See <> for more information on plugging in -other cache stores/providers. +https://github.com/ben-manes/caffeine/wiki[Caffeine] and JSR-107 compliant +caches. See <> for more information on plugging in other cache +stores/providers. [IMPORTANT] ==== @@ -9019,41 +9018,6 @@ The Caffeine `CacheManager` also supports customs `Caffeine` and `CacheLoader`. the https://github.com/ben-manes/caffeine/wiki[Caffeine documentation] for more information about those. -[[cache-store-configuration-guava]] -==== Guava Cache - -The Guava implementation is located under `org.springframework.cache.guava` package and -provides access to several features of Guava. - -Configuring a `CacheManager` that creates the cache on demand is straightforward: - -[source,xml,indent=0] -[subs="verbatim,quotes"] ----- - ----- - -It is also possible to provide the caches to use explicitly. In that case, only those -will be made available by the manager: - -[source,xml,indent=0] -[subs="verbatim,quotes"] ----- - - - - default - books - - - ----- - -The Guava `CacheManager` also supports customs `CacheBuilder` and `CacheLoader`. See -the https://code.google.com/p/guava-libraries/wiki/CachesExplained[Guava documentation] -for more information about those. - [[cache-store-configuration-gemfire]] ==== GemFire-based Cache