From c407dc3df817cbfad0c0b72d90b26ae2756653aa Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Mon, 17 Oct 2022 12:25:35 +0200 Subject: [PATCH] Reset/rebuild BeanPostProcessorCache within full synchronization Closes gh-29299 --- .../factory/support/AbstractBeanFactory.java | 82 +++++++++++-------- 1 file changed, 48 insertions(+), 34 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java index 5d7b60055b60..66d33cb6c020 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java +++ b/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. */ @Nullable - private volatile BeanPostProcessorCache beanPostProcessorCache; + private BeanPostProcessorCache beanPostProcessorCache; /** Map from scope identifier String to corresponding Scope. */ private final Map scopes = new LinkedHashMap<>(8); @@ -944,10 +944,12 @@ public String resolveEmbeddedValue(@Nullable String value) { @Override public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) { Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null"); - // Remove from old position, if any - this.beanPostProcessors.remove(beanPostProcessor); - // Add to end of list - this.beanPostProcessors.add(beanPostProcessor); + synchronized (this.beanPostProcessors) { + // Remove from old position, if any + this.beanPostProcessors.remove(beanPostProcessor); + // Add to end of list + this.beanPostProcessors.add(beanPostProcessor); + } } /** @@ -957,8 +959,12 @@ public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) { * @see #addBeanPostProcessor */ public void addBeanPostProcessors(Collection beanPostProcessors) { - this.beanPostProcessors.removeAll(beanPostProcessors); - this.beanPostProcessors.addAll(beanPostProcessors); + synchronized (this.beanPostProcessors) { + // Remove from old position, if any + this.beanPostProcessors.removeAll(beanPostProcessors); + // Add to end of list + this.beanPostProcessors.addAll(beanPostProcessors); + } } @Override @@ -980,26 +986,34 @@ public List getBeanPostProcessors() { * @since 5.3 */ BeanPostProcessorCache getBeanPostProcessorCache() { - BeanPostProcessorCache bpCache = this.beanPostProcessorCache; - if (bpCache == null) { - bpCache = new BeanPostProcessorCache(); - for (BeanPostProcessor bp : this.beanPostProcessors) { - if (bp instanceof InstantiationAwareBeanPostProcessor) { - bpCache.instantiationAware.add((InstantiationAwareBeanPostProcessor) bp); - if (bp instanceof SmartInstantiationAwareBeanPostProcessor) { - bpCache.smartInstantiationAware.add((SmartInstantiationAwareBeanPostProcessor) bp); + synchronized (this.beanPostProcessors) { + BeanPostProcessorCache bppCache = this.beanPostProcessorCache; + if (bppCache == null) { + bppCache = new BeanPostProcessorCache(); + for (BeanPostProcessor bpp : this.beanPostProcessors) { + if (bpp instanceof InstantiationAwareBeanPostProcessor) { + bppCache.instantiationAware.add((InstantiationAwareBeanPostProcessor) bpp); + 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) { - bpCache.destructionAware.add((DestructionAwareBeanPostProcessor) bp); - } - if (bp instanceof MergedBeanDefinitionPostProcessor) { - bpCache.mergedDefinition.add((MergedBeanDefinitionPostProcessor) bp); - } + this.beanPostProcessorCache = bppCache; } - this.beanPostProcessorCache = bpCache; + return bppCache; + } + } + + private void resetBeanPostProcessorCache() { + synchronized (this.beanPostProcessors) { + this.beanPostProcessorCache = null; } - return bpCache; } /** @@ -2014,27 +2028,27 @@ private class BeanPostProcessorCacheAwareList extends CopyOnWriteArrayList c) { boolean success = super.removeAll(c); if (success) { - beanPostProcessorCache = null; + resetBeanPostProcessorCache(); } return success; } @@ -2060,7 +2074,7 @@ public boolean removeAll(Collection c) { public boolean retainAll(Collection c) { boolean success = super.retainAll(c); if (success) { - beanPostProcessorCache = null; + resetBeanPostProcessorCache(); } return success; } @@ -2069,7 +2083,7 @@ public boolean retainAll(Collection c) { public boolean addAll(Collection c) { boolean success = super.addAll(c); if (success) { - beanPostProcessorCache = null; + resetBeanPostProcessorCache(); } return success; } @@ -2078,7 +2092,7 @@ public boolean addAll(Collection c) { public boolean addAll(int index, Collection c) { boolean success = super.addAll(index, c); if (success) { - beanPostProcessorCache = null; + resetBeanPostProcessorCache(); } return success; } @@ -2087,7 +2101,7 @@ public boolean addAll(int index, Collection c) { public boolean removeIf(Predicate filter) { boolean success = super.removeIf(filter); if (success) { - beanPostProcessorCache = null; + resetBeanPostProcessorCache(); } return success; } @@ -2095,7 +2109,7 @@ public boolean removeIf(Predicate filter) { @Override public void replaceAll(UnaryOperator operator) { super.replaceAll(operator); - beanPostProcessorCache = null; + resetBeanPostProcessorCache(); } }