Skip to content

Commit c407dc3

Browse files
committed
Reset/rebuild BeanPostProcessorCache within full synchronization
Closes gh-29299
1 parent 1439c5b commit c407dc3

File tree

1 file changed

+48
-34
lines changed

1 file changed

+48
-34
lines changed

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

Lines changed: 48 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
161161

162162
/** Cache of pre-filtered post-processors. */
163163
@Nullable
164-
private volatile BeanPostProcessorCache beanPostProcessorCache;
164+
private BeanPostProcessorCache beanPostProcessorCache;
165165

166166
/** Map from scope identifier String to corresponding Scope. */
167167
private final Map<String, Scope> scopes = new LinkedHashMap<>(8);
@@ -944,10 +944,12 @@ public String resolveEmbeddedValue(@Nullable String value) {
944944
@Override
945945
public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
946946
Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
947-
// Remove from old position, if any
948-
this.beanPostProcessors.remove(beanPostProcessor);
949-
// Add to end of list
950-
this.beanPostProcessors.add(beanPostProcessor);
947+
synchronized (this.beanPostProcessors) {
948+
// Remove from old position, if any
949+
this.beanPostProcessors.remove(beanPostProcessor);
950+
// Add to end of list
951+
this.beanPostProcessors.add(beanPostProcessor);
952+
}
951953
}
952954

953955
/**
@@ -957,8 +959,12 @@ public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
957959
* @see #addBeanPostProcessor
958960
*/
959961
public void addBeanPostProcessors(Collection<? extends BeanPostProcessor> beanPostProcessors) {
960-
this.beanPostProcessors.removeAll(beanPostProcessors);
961-
this.beanPostProcessors.addAll(beanPostProcessors);
962+
synchronized (this.beanPostProcessors) {
963+
// Remove from old position, if any
964+
this.beanPostProcessors.removeAll(beanPostProcessors);
965+
// Add to end of list
966+
this.beanPostProcessors.addAll(beanPostProcessors);
967+
}
962968
}
963969

964970
@Override
@@ -980,26 +986,34 @@ public List<BeanPostProcessor> getBeanPostProcessors() {
980986
* @since 5.3
981987
*/
982988
BeanPostProcessorCache getBeanPostProcessorCache() {
983-
BeanPostProcessorCache bpCache = this.beanPostProcessorCache;
984-
if (bpCache == null) {
985-
bpCache = new BeanPostProcessorCache();
986-
for (BeanPostProcessor bp : this.beanPostProcessors) {
987-
if (bp instanceof InstantiationAwareBeanPostProcessor) {
988-
bpCache.instantiationAware.add((InstantiationAwareBeanPostProcessor) bp);
989-
if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
990-
bpCache.smartInstantiationAware.add((SmartInstantiationAwareBeanPostProcessor) bp);
989+
synchronized (this.beanPostProcessors) {
990+
BeanPostProcessorCache bppCache = this.beanPostProcessorCache;
991+
if (bppCache == null) {
992+
bppCache = new BeanPostProcessorCache();
993+
for (BeanPostProcessor bpp : this.beanPostProcessors) {
994+
if (bpp instanceof InstantiationAwareBeanPostProcessor) {
995+
bppCache.instantiationAware.add((InstantiationAwareBeanPostProcessor) bpp);
996+
if (bpp instanceof SmartInstantiationAwareBeanPostProcessor) {
997+
bppCache.smartInstantiationAware.add((SmartInstantiationAwareBeanPostProcessor) bpp);
998+
}
999+
}
1000+
if (bpp instanceof DestructionAwareBeanPostProcessor) {
1001+
bppCache.destructionAware.add((DestructionAwareBeanPostProcessor) bpp);
1002+
}
1003+
if (bpp instanceof MergedBeanDefinitionPostProcessor) {
1004+
bppCache.mergedDefinition.add((MergedBeanDefinitionPostProcessor) bpp);
9911005
}
9921006
}
993-
if (bp instanceof DestructionAwareBeanPostProcessor) {
994-
bpCache.destructionAware.add((DestructionAwareBeanPostProcessor) bp);
995-
}
996-
if (bp instanceof MergedBeanDefinitionPostProcessor) {
997-
bpCache.mergedDefinition.add((MergedBeanDefinitionPostProcessor) bp);
998-
}
1007+
this.beanPostProcessorCache = bppCache;
9991008
}
1000-
this.beanPostProcessorCache = bpCache;
1009+
return bppCache;
1010+
}
1011+
}
1012+
1013+
private void resetBeanPostProcessorCache() {
1014+
synchronized (this.beanPostProcessors) {
1015+
this.beanPostProcessorCache = null;
10011016
}
1002-
return bpCache;
10031017
}
10041018

10051019
/**
@@ -2014,35 +2028,35 @@ private class BeanPostProcessorCacheAwareList extends CopyOnWriteArrayList<BeanP
20142028
@Override
20152029
public BeanPostProcessor set(int index, BeanPostProcessor element) {
20162030
BeanPostProcessor result = super.set(index, element);
2017-
beanPostProcessorCache = null;
2031+
resetBeanPostProcessorCache();
20182032
return result;
20192033
}
20202034

20212035
@Override
20222036
public boolean add(BeanPostProcessor o) {
20232037
boolean success = super.add(o);
2024-
beanPostProcessorCache = null;
2038+
resetBeanPostProcessorCache();
20252039
return success;
20262040
}
20272041

20282042
@Override
20292043
public void add(int index, BeanPostProcessor element) {
20302044
super.add(index, element);
2031-
beanPostProcessorCache = null;
2045+
resetBeanPostProcessorCache();
20322046
}
20332047

20342048
@Override
20352049
public BeanPostProcessor remove(int index) {
20362050
BeanPostProcessor result = super.remove(index);
2037-
beanPostProcessorCache = null;
2051+
resetBeanPostProcessorCache();
20382052
return result;
20392053
}
20402054

20412055
@Override
20422056
public boolean remove(Object o) {
20432057
boolean success = super.remove(o);
20442058
if (success) {
2045-
beanPostProcessorCache = null;
2059+
resetBeanPostProcessorCache();
20462060
}
20472061
return success;
20482062
}
@@ -2051,7 +2065,7 @@ public boolean remove(Object o) {
20512065
public boolean removeAll(Collection<?> c) {
20522066
boolean success = super.removeAll(c);
20532067
if (success) {
2054-
beanPostProcessorCache = null;
2068+
resetBeanPostProcessorCache();
20552069
}
20562070
return success;
20572071
}
@@ -2060,7 +2074,7 @@ public boolean removeAll(Collection<?> c) {
20602074
public boolean retainAll(Collection<?> c) {
20612075
boolean success = super.retainAll(c);
20622076
if (success) {
2063-
beanPostProcessorCache = null;
2077+
resetBeanPostProcessorCache();
20642078
}
20652079
return success;
20662080
}
@@ -2069,7 +2083,7 @@ public boolean retainAll(Collection<?> c) {
20692083
public boolean addAll(Collection<? extends BeanPostProcessor> c) {
20702084
boolean success = super.addAll(c);
20712085
if (success) {
2072-
beanPostProcessorCache = null;
2086+
resetBeanPostProcessorCache();
20732087
}
20742088
return success;
20752089
}
@@ -2078,7 +2092,7 @@ public boolean addAll(Collection<? extends BeanPostProcessor> c) {
20782092
public boolean addAll(int index, Collection<? extends BeanPostProcessor> c) {
20792093
boolean success = super.addAll(index, c);
20802094
if (success) {
2081-
beanPostProcessorCache = null;
2095+
resetBeanPostProcessorCache();
20822096
}
20832097
return success;
20842098
}
@@ -2087,15 +2101,15 @@ public boolean addAll(int index, Collection<? extends BeanPostProcessor> c) {
20872101
public boolean removeIf(Predicate<? super BeanPostProcessor> filter) {
20882102
boolean success = super.removeIf(filter);
20892103
if (success) {
2090-
beanPostProcessorCache = null;
2104+
resetBeanPostProcessorCache();
20912105
}
20922106
return success;
20932107
}
20942108

20952109
@Override
20962110
public void replaceAll(UnaryOperator<BeanPostProcessor> operator) {
20972111
super.replaceAll(operator);
2098-
beanPostProcessorCache = null;
2112+
resetBeanPostProcessorCache();
20992113
}
21002114
}
21012115

0 commit comments

Comments
 (0)