Browse Source

Reset/rebuild BeanPostProcessorCache within full synchronization

Closes gh-29299
pull/28678/head
Juergen Hoeller 4 years ago
parent
commit
c407dc3df8
  1. 82
      spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java

82
spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java

@ -161,7 +161,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
/** Cache of pre-filtered post-processors. */ /** Cache of pre-filtered post-processors. */
@Nullable @Nullable
private volatile BeanPostProcessorCache beanPostProcessorCache; private BeanPostProcessorCache beanPostProcessorCache;
/** Map from scope identifier String to corresponding Scope. */ /** Map from scope identifier String to corresponding Scope. */
private final Map<String, Scope> scopes = new LinkedHashMap<>(8); private final Map<String, Scope> scopes = new LinkedHashMap<>(8);
@ -944,10 +944,12 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
@Override @Override
public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) { public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null"); Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
// Remove from old position, if any synchronized (this.beanPostProcessors) {
this.beanPostProcessors.remove(beanPostProcessor); // Remove from old position, if any
// Add to end of list this.beanPostProcessors.remove(beanPostProcessor);
this.beanPostProcessors.add(beanPostProcessor); // Add to end of list
this.beanPostProcessors.add(beanPostProcessor);
}
} }
/** /**
@ -957,8 +959,12 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
* @see #addBeanPostProcessor * @see #addBeanPostProcessor
*/ */
public void addBeanPostProcessors(Collection<? extends BeanPostProcessor> beanPostProcessors) { public void addBeanPostProcessors(Collection<? extends BeanPostProcessor> beanPostProcessors) {
this.beanPostProcessors.removeAll(beanPostProcessors); synchronized (this.beanPostProcessors) {
this.beanPostProcessors.addAll(beanPostProcessors); // Remove from old position, if any
this.beanPostProcessors.removeAll(beanPostProcessors);
// Add to end of list
this.beanPostProcessors.addAll(beanPostProcessors);
}
} }
@Override @Override
@ -980,26 +986,34 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
* @since 5.3 * @since 5.3
*/ */
BeanPostProcessorCache getBeanPostProcessorCache() { BeanPostProcessorCache getBeanPostProcessorCache() {
BeanPostProcessorCache bpCache = this.beanPostProcessorCache; synchronized (this.beanPostProcessors) {
if (bpCache == null) { BeanPostProcessorCache bppCache = this.beanPostProcessorCache;
bpCache = new BeanPostProcessorCache(); if (bppCache == null) {
for (BeanPostProcessor bp : this.beanPostProcessors) { bppCache = new BeanPostProcessorCache();
if (bp instanceof InstantiationAwareBeanPostProcessor) { for (BeanPostProcessor bpp : this.beanPostProcessors) {
bpCache.instantiationAware.add((InstantiationAwareBeanPostProcessor) bp); if (bpp instanceof InstantiationAwareBeanPostProcessor) {
if (bp instanceof SmartInstantiationAwareBeanPostProcessor) { bppCache.instantiationAware.add((InstantiationAwareBeanPostProcessor) bpp);
bpCache.smartInstantiationAware.add((SmartInstantiationAwareBeanPostProcessor) bp); if (bpp instanceof SmartInstantiationAwareBeanPostProcessor) {
bppCache.smartInstantiationAware.add((SmartInstantiationAwareBeanPostProcessor) bpp);
}
}
if (bpp instanceof DestructionAwareBeanPostProcessor) {
bppCache.destructionAware.add((DestructionAwareBeanPostProcessor) bpp);
}
if (bpp instanceof MergedBeanDefinitionPostProcessor) {
bppCache.mergedDefinition.add((MergedBeanDefinitionPostProcessor) bpp);
} }
} }
if (bp instanceof DestructionAwareBeanPostProcessor) { this.beanPostProcessorCache = bppCache;
bpCache.destructionAware.add((DestructionAwareBeanPostProcessor) bp);
}
if (bp instanceof MergedBeanDefinitionPostProcessor) {
bpCache.mergedDefinition.add((MergedBeanDefinitionPostProcessor) bp);
}
} }
this.beanPostProcessorCache = bpCache; return bppCache;
}
}
private void resetBeanPostProcessorCache() {
synchronized (this.beanPostProcessors) {
this.beanPostProcessorCache = null;
} }
return bpCache;
} }
/** /**
@ -2014,27 +2028,27 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
@Override @Override
public BeanPostProcessor set(int index, BeanPostProcessor element) { public BeanPostProcessor set(int index, BeanPostProcessor element) {
BeanPostProcessor result = super.set(index, element); BeanPostProcessor result = super.set(index, element);
beanPostProcessorCache = null; resetBeanPostProcessorCache();
return result; return result;
} }
@Override @Override
public boolean add(BeanPostProcessor o) { public boolean add(BeanPostProcessor o) {
boolean success = super.add(o); boolean success = super.add(o);
beanPostProcessorCache = null; resetBeanPostProcessorCache();
return success; return success;
} }
@Override @Override
public void add(int index, BeanPostProcessor element) { public void add(int index, BeanPostProcessor element) {
super.add(index, element); super.add(index, element);
beanPostProcessorCache = null; resetBeanPostProcessorCache();
} }
@Override @Override
public BeanPostProcessor remove(int index) { public BeanPostProcessor remove(int index) {
BeanPostProcessor result = super.remove(index); BeanPostProcessor result = super.remove(index);
beanPostProcessorCache = null; resetBeanPostProcessorCache();
return result; return result;
} }
@ -2042,7 +2056,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
public boolean remove(Object o) { public boolean remove(Object o) {
boolean success = super.remove(o); boolean success = super.remove(o);
if (success) { if (success) {
beanPostProcessorCache = null; resetBeanPostProcessorCache();
} }
return success; return success;
} }
@ -2051,7 +2065,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
public boolean removeAll(Collection<?> c) { public boolean removeAll(Collection<?> c) {
boolean success = super.removeAll(c); boolean success = super.removeAll(c);
if (success) { if (success) {
beanPostProcessorCache = null; resetBeanPostProcessorCache();
} }
return success; return success;
} }
@ -2060,7 +2074,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
public boolean retainAll(Collection<?> c) { public boolean retainAll(Collection<?> c) {
boolean success = super.retainAll(c); boolean success = super.retainAll(c);
if (success) { if (success) {
beanPostProcessorCache = null; resetBeanPostProcessorCache();
} }
return success; return success;
} }
@ -2069,7 +2083,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
public boolean addAll(Collection<? extends BeanPostProcessor> c) { public boolean addAll(Collection<? extends BeanPostProcessor> c) {
boolean success = super.addAll(c); boolean success = super.addAll(c);
if (success) { if (success) {
beanPostProcessorCache = null; resetBeanPostProcessorCache();
} }
return success; return success;
} }
@ -2078,7 +2092,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
public boolean addAll(int index, Collection<? extends BeanPostProcessor> c) { public boolean addAll(int index, Collection<? extends BeanPostProcessor> c) {
boolean success = super.addAll(index, c); boolean success = super.addAll(index, c);
if (success) { if (success) {
beanPostProcessorCache = null; resetBeanPostProcessorCache();
} }
return success; return success;
} }
@ -2087,7 +2101,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
public boolean removeIf(Predicate<? super BeanPostProcessor> filter) { public boolean removeIf(Predicate<? super BeanPostProcessor> filter) {
boolean success = super.removeIf(filter); boolean success = super.removeIf(filter);
if (success) { if (success) {
beanPostProcessorCache = null; resetBeanPostProcessorCache();
} }
return success; return success;
} }
@ -2095,7 +2109,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
@Override @Override
public void replaceAll(UnaryOperator<BeanPostProcessor> operator) { public void replaceAll(UnaryOperator<BeanPostProcessor> operator) {
super.replaceAll(operator); super.replaceAll(operator);
beanPostProcessorCache = null; resetBeanPostProcessorCache();
} }
} }

Loading…
Cancel
Save