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 @@ - - - +