Browse Source

Cache InjectionMetadata per bean name instead of per Class, if possible

Issue: SPR-11027
pull/393/merge
Juergen Hoeller 12 years ago
parent
commit
4675bc4e0c
  1. 9
      spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java
  2. 8
      spring-context/src/main/java/org/springframework/context/annotation/CommonAnnotationBeanPostProcessor.java
  3. 9
      spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java

9
spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java

@ -59,6 +59,7 @@ import org.springframework.core.annotation.AnnotationAttributes; @@ -59,6 +59,7 @@ import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.StringUtils;
/**
* {@link org.springframework.beans.factory.config.BeanPostProcessor} implementation
@ -313,13 +314,15 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean @@ -313,13 +314,15 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean
private InjectionMetadata findAutowiringMetadata(String beanName, Class<?> clazz) {
// Quick check on the concurrent map first, with minimal locking.
InjectionMetadata metadata = this.injectionMetadataCache.get(beanName);
// Fall back to class name as cache key, for backwards compatibility with custom callers.
String cacheKey = (StringUtils.hasLength(beanName) ? beanName : clazz.getName());
InjectionMetadata metadata = this.injectionMetadataCache.get(cacheKey);
if (metadata == null) {
synchronized (this.injectionMetadataCache) {
metadata = this.injectionMetadataCache.get(beanName);
metadata = this.injectionMetadataCache.get(cacheKey);
if (metadata == null) {
metadata = buildAutowiringMetadata(clazz);
this.injectionMetadataCache.put(beanName, metadata);
this.injectionMetadataCache.put(cacheKey, metadata);
}
}
}

8
spring-context/src/main/java/org/springframework/context/annotation/CommonAnnotationBeanPostProcessor.java

@ -312,10 +312,12 @@ public class CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBean @@ -312,10 +312,12 @@ public class CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBean
private InjectionMetadata findResourceMetadata(String beanName, final Class<?> clazz) {
// Quick check on the concurrent map first, with minimal locking.
InjectionMetadata metadata = this.injectionMetadataCache.get(beanName);
// Fall back to class name as cache key, for backwards compatibility with custom callers.
String cacheKey = (StringUtils.hasLength(beanName) ? beanName : clazz.getName());
InjectionMetadata metadata = this.injectionMetadataCache.get(cacheKey);
if (metadata == null) {
synchronized (this.injectionMetadataCache) {
metadata = this.injectionMetadataCache.get(beanName);
metadata = this.injectionMetadataCache.get(cacheKey);
if (metadata == null) {
LinkedList<InjectionMetadata.InjectedElement> elements = new LinkedList<InjectionMetadata.InjectedElement>();
Class<?> targetClass = clazz;
@ -389,7 +391,7 @@ public class CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBean @@ -389,7 +391,7 @@ public class CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBean
while (targetClass != null && targetClass != Object.class);
metadata = new InjectionMetadata(clazz, elements);
this.injectionMetadataCache.put(beanName, metadata);
this.injectionMetadataCache.put(cacheKey, metadata);
}
}
}

9
spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java

@ -62,6 +62,7 @@ import org.springframework.orm.jpa.SharedEntityManagerCreator; @@ -62,6 +62,7 @@ import org.springframework.orm.jpa.SharedEntityManagerCreator;
import org.springframework.util.ClassUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.StringUtils;
/**
* BeanPostProcessor that processes {@link javax.persistence.PersistenceUnit}
@ -376,10 +377,12 @@ public class PersistenceAnnotationBeanPostProcessor @@ -376,10 +377,12 @@ public class PersistenceAnnotationBeanPostProcessor
private InjectionMetadata findPersistenceMetadata(String beanName, final Class<?> clazz) {
// Quick check on the concurrent map first, with minimal locking.
InjectionMetadata metadata = this.injectionMetadataCache.get(beanName);
// Fall back to class name as cache key, for backwards compatibility with custom callers.
String cacheKey = (StringUtils.hasLength(beanName) ? beanName : clazz.getName());
InjectionMetadata metadata = this.injectionMetadataCache.get(cacheKey);
if (metadata == null) {
synchronized (this.injectionMetadataCache) {
metadata = this.injectionMetadataCache.get(beanName);
metadata = this.injectionMetadataCache.get(cacheKey);
if (metadata == null) {
LinkedList<InjectionMetadata.InjectedElement> elements = new LinkedList<InjectionMetadata.InjectedElement>();
Class<?> targetClass = clazz;
@ -417,7 +420,7 @@ public class PersistenceAnnotationBeanPostProcessor @@ -417,7 +420,7 @@ public class PersistenceAnnotationBeanPostProcessor
while (targetClass != null && targetClass != Object.class);
metadata = new InjectionMetadata(clazz, elements);
this.injectionMetadataCache.put(beanName, metadata);
this.injectionMetadataCache.put(cacheKey, metadata);
}
}
}

Loading…
Cancel
Save