diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java
index a3d377bc5d..b332faabae 100644
--- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java
+++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java
@@ -181,10 +181,12 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser {
cachingTransformerDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
cachingTransformerDef.setConstructorArgumentValues(cavs);
- String cacheBeanName = resourceCacheElement.getAttribute("cache");
- if (StringUtils.hasText(cacheBeanName)) {
- RuntimeBeanReference cacheRef = new RuntimeBeanReference(cacheBeanName);
- cavs.addIndexedArgumentValue(0, cacheRef);
+ String cacheManagerName = resourceCacheElement.getAttribute("cache-manager");
+ String cacheName = resourceCacheElement.getAttribute("cache-name");
+ if (StringUtils.hasText(cacheManagerName) && StringUtils.hasText(cacheName)) {
+ RuntimeBeanReference cacheManagerRef = new RuntimeBeanReference(cacheManagerName);
+ cavs.addIndexedArgumentValue(0, cacheManagerRef);
+ cavs.addIndexedArgumentValue(1, cacheName);
}
else {
ConstructorArgumentValues cacheCavs = new ConstructorArgumentValues();
diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/CachingResourceResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/CachingResourceResolver.java
index 59d195fd22..f36ae9fbfc 100644
--- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/CachingResourceResolver.java
+++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/CachingResourceResolver.java
@@ -17,6 +17,7 @@
package org.springframework.web.servlet.resource;
import org.springframework.cache.Cache;
+import org.springframework.cache.CacheManager;
import org.springframework.core.io.Resource;
import org.springframework.util.Assert;
@@ -40,6 +41,9 @@ public class CachingResourceResolver extends AbstractResourceResolver {
private final Cache cache;
+ public CachingResourceResolver(CacheManager cacheManager, String cacheName) {
+ this(cacheManager.getCache(cacheName));
+ }
public CachingResourceResolver(Cache cache) {
Assert.notNull(cache, "'cache' is required");
diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/CachingResourceTransformer.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/CachingResourceTransformer.java
index 3e27f9df12..722d2c606d 100644
--- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/CachingResourceTransformer.java
+++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/CachingResourceTransformer.java
@@ -19,6 +19,7 @@ package org.springframework.web.servlet.resource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.cache.Cache;
+import org.springframework.cache.CacheManager;
import org.springframework.core.io.Resource;
import org.springframework.util.Assert;
@@ -40,6 +41,9 @@ public class CachingResourceTransformer implements ResourceTransformer {
private final Cache cache;
+ public CachingResourceTransformer(CacheManager cacheManager, String cacheName) {
+ this(cacheManager.getCache(cacheName));
+ }
public CachingResourceTransformer(Cache cache) {
Assert.notNull(cache, "'cache' is required");
diff --git a/spring-webmvc/src/main/resources/org/springframework/web/servlet/config/spring-mvc-4.1.xsd b/spring-webmvc/src/main/resources/org/springframework/web/servlet/config/spring-mvc-4.1.xsd
index 8c9f43155a..0efe262195 100644
--- a/spring-webmvc/src/main/resources/org/springframework/web/servlet/config/spring-mvc-4.1.xsd
+++ b/spring-webmvc/src/main/resources/org/springframework/web/servlet/config/spring-mvc-4.1.xsd
@@ -342,10 +342,12 @@
-
+
+
diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java
index 5975bc3ffb..ab9024fba6 100644
--- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java
+++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java
@@ -32,6 +32,8 @@ import org.junit.Test;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.beans.TypeMismatchException;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
+import org.springframework.cache.Cache;
+import org.springframework.cache.CacheManager;
import org.springframework.cache.concurrent.ConcurrentMapCache;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.core.Ordered;
@@ -350,7 +352,8 @@ public class MvcNamespaceTests {
assertThat(resolvers.get(2), Matchers.instanceOf(PathResourceResolver.class));
CachingResourceResolver cachingResolver = (CachingResourceResolver) resolvers.get(0);
- assertThat(cachingResolver.getCache(), Matchers.instanceOf(TestResourceCache.class));
+ assertThat(cachingResolver.getCache(), Matchers.instanceOf(ConcurrentMapCache.class));
+ assertEquals("test-resource-cache", cachingResolver.getCache().getName());
VersionResourceResolver versionResolver = (VersionResourceResolver) resolvers.get(1);
assertThat(versionResolver.getStrategyMap().get("/**/*.js"),
@@ -363,6 +366,10 @@ public class MvcNamespaceTests {
assertThat(transformers.get(0), Matchers.instanceOf(CachingResourceTransformer.class));
assertThat(transformers.get(1), Matchers.instanceOf(CssLinkResourceTransformer.class));
assertThat(transformers.get(2), Matchers.instanceOf(AppCacheManifestTransformer.class));
+
+ CachingResourceTransformer cachingTransformer = (CachingResourceTransformer) transformers.get(0);
+ assertThat(cachingTransformer.getCache(), Matchers.instanceOf(ConcurrentMapCache.class));
+ assertEquals("test-resource-cache", cachingTransformer.getCache().getName());
}
@Test
@@ -869,9 +876,15 @@ public class MvcNamespaceTests {
public static class TestPathHelper extends UrlPathHelper { }
- public static class TestResourceCache extends ConcurrentMapCache {
- public TestResourceCache(String name) {
- super(name);
+ public static class TestCacheManager implements CacheManager {
+ @Override
+ public Cache getCache(String name) {
+ return new ConcurrentMapCache(name);
+ }
+
+ @Override
+ public Collection getCacheNames() {
+ return null;
}
}
diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-resources-chain.xml b/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-resources-chain.xml
index ebda2c5857..9023908ae2 100644
--- a/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-resources-chain.xml
+++ b/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-resources-chain.xml
@@ -23,7 +23,7 @@
-
+
@@ -36,7 +36,5 @@
-
-
-
+