From 7b711c4aac75e5ad32fd94102b4adcf79b5aa71f Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 13 Nov 2015 08:26:43 +0100 Subject: [PATCH] AbstractAutoProxyCreator uses prefixed bean name as cache key Issue: SPR-13655 --- .../autoproxy/AbstractAutoProxyCreator.java | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/AbstractAutoProxyCreator.java b/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/AbstractAutoProxyCreator.java index efa81effd3..eb476b4ec4 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/AbstractAutoProxyCreator.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/AbstractAutoProxyCreator.java @@ -42,9 +42,11 @@ import org.springframework.beans.BeansException; import org.springframework.beans.PropertyValues; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; +import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor; +import org.springframework.util.StringUtils; /** * {@link org.springframework.beans.factory.config.BeanPostProcessor} implementation @@ -125,8 +127,6 @@ public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport private BeanFactory beanFactory; - private final Map advisedBeans = new ConcurrentHashMap(64); - private final Set targetSourcedBeans = Collections.newSetFromMap(new ConcurrentHashMap(16)); @@ -135,6 +135,8 @@ public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport private final Map> proxyTypes = new ConcurrentHashMap>(16); + private final Map advisedBeans = new ConcurrentHashMap(256); + /** * Set whether or not the proxy should be frozen, preventing advice @@ -214,6 +216,9 @@ public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport @Override public Class predictBeanType(Class beanClass, String beanName) { + if (this.proxyTypes.isEmpty()) { + return null; + } Object cacheKey = getCacheKey(beanClass, beanName); return this.proxyTypes.get(cacheKey); } @@ -299,12 +304,23 @@ public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport /** * Build a cache key for the given bean class and bean name. + *

Note: As of 4.2.3, this implementation does not return a concatenated + * class/name String anymore but rather the most efficient cache key possible: + * a plain bean name, prepended with {@link BeanFactory#FACTORY_BEAN_PREFIX} + * in case of a {@code FactoryBean}; or if no bean name specified, then the + * given bean {@code Class} as-is. * @param beanClass the bean class * @param beanName the bean name * @return the cache key for the given class and name */ protected Object getCacheKey(Class beanClass, String beanName) { - return beanClass.getName() + "_" + beanName; + if (StringUtils.hasLength(beanName)) { + return (FactoryBean.class.isAssignableFrom(beanClass) ? + BeanFactory.FACTORY_BEAN_PREFIX + beanName : beanName); + } + else { + return beanClass; + } } /** @@ -420,7 +436,7 @@ public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport protected Object createProxy( Class beanClass, String beanName, Object[] specificInterceptors, TargetSource targetSource) { - if (beanName != null && this.beanFactory instanceof ConfigurableListableBeanFactory) { + if (this.beanFactory instanceof ConfigurableListableBeanFactory) { AutoProxyUtils.exposeTargetClass((ConfigurableListableBeanFactory) this.beanFactory, beanName, beanClass); }