Reset/rebuild BeanPostProcessorCache within full synchronization
Closes gh-29299
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user