diff --git a/org.springframework.context/src/main/java/org/springframework/cache/config/AnnotationDrivenCacheBeanDefinitionParser.java b/org.springframework.context/src/main/java/org/springframework/cache/config/AnnotationDrivenCacheBeanDefinitionParser.java index 49b2bf4829f..0dfd4091db3 100644 --- a/org.springframework.context/src/main/java/org/springframework/cache/config/AnnotationDrivenCacheBeanDefinitionParser.java +++ b/org.springframework.context/src/main/java/org/springframework/cache/config/AnnotationDrivenCacheBeanDefinitionParser.java @@ -16,7 +16,7 @@ package org.springframework.cache.config; -import org.w3c.dom.Element; +import static org.springframework.context.annotation.AnnotationConfigUtils.*; import org.springframework.aop.config.AopNamespaceUtils; import org.springframework.beans.factory.config.BeanDefinition; @@ -29,8 +29,7 @@ import org.springframework.beans.factory.xml.ParserContext; import org.springframework.cache.annotation.AnnotationCacheOperationSource; import org.springframework.cache.interceptor.BeanFactoryCacheOperationSourceAdvisor; import org.springframework.cache.interceptor.CacheInterceptor; - -import static org.springframework.context.annotation.AnnotationConfigUtils.*; +import org.w3c.dom.Element; /** * {@link org.springframework.beans.factory.xml.BeanDefinitionParser} @@ -63,10 +62,11 @@ class AnnotationDrivenCacheBeanDefinitionParser implements BeanDefinitionParser // mode="proxy" AopAutoProxyConfigurer.configureAutoProxyCreator(element, parserContext); } + return null; } - private static void registerCacheManagerProperty(Element element, BeanDefinition def) { + private static void parseCacheManagerProperty(Element element, BeanDefinition def) { def.getPropertyValues().add("cacheManager", new RuntimeBeanReference(CacheNamespaceHandler.extractCacheManager(element))); } @@ -87,7 +87,8 @@ class AnnotationDrivenCacheBeanDefinitionParser implements BeanDefinitionParser RootBeanDefinition def = new RootBeanDefinition(); def.setBeanClassName(CACHE_ASPECT_CLASS_NAME); def.setFactoryMethodName("aspectOf"); - registerCacheManagerProperty(element, def); + parseCacheManagerProperty(element, def); + CacheNamespaceHandler.parseKeyGenerator(element, def); parserContext.registerBeanComponent(new BeanComponentDefinition(def, CACHE_ASPECT_BEAN_NAME)); } } @@ -114,7 +115,7 @@ class AnnotationDrivenCacheBeanDefinitionParser implements BeanDefinitionParser RootBeanDefinition interceptorDef = new RootBeanDefinition(CacheInterceptor.class); interceptorDef.setSource(eleSource); interceptorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - registerCacheManagerProperty(element, interceptorDef); + parseCacheManagerProperty(element, interceptorDef); interceptorDef.getPropertyValues().add("cacheOperationSources", new RuntimeBeanReference(sourceName)); String interceptorName = parserContext.getReaderContext().registerWithGeneratedName(interceptorDef); @@ -138,5 +139,4 @@ class AnnotationDrivenCacheBeanDefinitionParser implements BeanDefinitionParser } } } - -} +} \ No newline at end of file diff --git a/org.springframework.context/src/main/java/org/springframework/cache/config/CacheAdviceParser.java b/org.springframework.context/src/main/java/org/springframework/cache/config/CacheAdviceParser.java index 8a5bad13d60..ae8de0310f7 100644 --- a/org.springframework.context/src/main/java/org/springframework/cache/config/CacheAdviceParser.java +++ b/org.springframework.context/src/main/java/org/springframework/cache/config/CacheAdviceParser.java @@ -110,6 +110,7 @@ class CacheAdviceParser extends AbstractSingleBeanDefinitionParser { @Override protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { builder.addPropertyReference("cacheManager", CacheNamespaceHandler.extractCacheManager(element)); + CacheNamespaceHandler.parseKeyGenerator(element, builder.getBeanDefinition()); List cacheDefs = DomUtils.getChildElementsByTagName(element, DEFS_ELEMENT); if (cacheDefs.size() >= 1) { diff --git a/org.springframework.context/src/main/java/org/springframework/cache/config/CacheNamespaceHandler.java b/org.springframework.context/src/main/java/org/springframework/cache/config/CacheNamespaceHandler.java index 29e7f096e61..cf94fef85a2 100644 --- a/org.springframework.context/src/main/java/org/springframework/cache/config/CacheNamespaceHandler.java +++ b/org.springframework.context/src/main/java/org/springframework/cache/config/CacheNamespaceHandler.java @@ -16,7 +16,10 @@ package org.springframework.cache.config; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.beans.factory.xml.NamespaceHandlerSupport; +import org.springframework.util.StringUtils; import org.w3c.dom.Element; /** @@ -40,9 +43,16 @@ public class CacheNamespaceHandler extends NamespaceHandlerSupport { : CacheNamespaceHandler.DEFAULT_CACHE_MANAGER_BEAN_NAME); } + static BeanDefinition parseKeyGenerator(Element element, BeanDefinition def) { + String name = element.getAttribute("key-generator"); + if (StringUtils.hasText(name)) { + def.getPropertyValues().add("keyGenerator", new RuntimeBeanReference(name.trim())); + } + return def; + } + public void init() { registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenCacheBeanDefinitionParser()); registerBeanDefinitionParser("advice", new CacheAdviceParser()); } - } diff --git a/org.springframework.context/src/main/resources/org/springframework/cache/config/spring-cache-3.1.xsd b/org.springframework.context/src/main/resources/org/springframework/cache/config/spring-cache-3.1.xsd index f1185f165ba..2ffee69a392 100644 --- a/org.springframework.context/src/main/resources/org/springframework/cache/config/spring-cache-3.1.xsd +++ b/org.springframework.context/src/main/resources/org/springframework/cache/config/spring-cache-3.1.xsd @@ -45,6 +45,21 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/org.springframework.context/src/test/java/org/springframework/cache/config/AbstractAnnotationTests.java b/org.springframework.context/src/test/java/org/springframework/cache/config/AbstractAnnotationTests.java index cad5e470402..15eb5e077c1 100644 --- a/org.springframework.context/src/test/java/org/springframework/cache/config/AbstractAnnotationTests.java +++ b/org.springframework.context/src/test/java/org/springframework/cache/config/AbstractAnnotationTests.java @@ -20,11 +20,13 @@ import static org.junit.Assert.*; import java.util.UUID; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.springframework.aop.framework.AopProxyUtils; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; +import org.springframework.cache.interceptor.CacheInterceptor; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; @@ -284,4 +286,10 @@ public abstract class AbstractAnnotationTests { public void testClassUncheckedException() throws Exception { testUncheckedThrowable(ccs); } + + @Test + public void testKeyStrategy() throws Exception { + CacheInterceptor bean = ctx.getBean("cacheAdviceClass", CacheInterceptor.class); + Assert.assertSame(ctx.getBean("keyGenerator"), bean.getKeyGenerator()); + } } \ No newline at end of file diff --git a/org.springframework.context/src/test/java/org/springframework/cache/config/SomeKeyGenerator.java b/org.springframework.context/src/test/java/org/springframework/cache/config/SomeKeyGenerator.java new file mode 100644 index 00000000000..fb38a7ea6d9 --- /dev/null +++ b/org.springframework.context/src/test/java/org/springframework/cache/config/SomeKeyGenerator.java @@ -0,0 +1,23 @@ +/* + * Copyright 2011 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.config; + +import org.springframework.cache.interceptor.DefaultKeyGenerator; + +public class SomeKeyGenerator extends DefaultKeyGenerator { + +} diff --git a/org.springframework.context/src/test/resources/org/springframework/cache/config/cache-advice.xml b/org.springframework.context/src/test/resources/org/springframework/cache/config/cache-advice.xml index e0e3f4d92cc..cc69de1d09a 100644 --- a/org.springframework.context/src/test/resources/org/springframework/cache/config/cache-advice.xml +++ b/org.springframework.context/src/test/resources/org/springframework/cache/config/cache-advice.xml @@ -22,7 +22,7 @@ - + @@ -50,6 +50,8 @@ + +