@@ -161,7 +161,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
161
161
162
162
/** Cache of pre-filtered post-processors. */
163
163
@ Nullable
164
- private volatile BeanPostProcessorCache beanPostProcessorCache ;
164
+ private BeanPostProcessorCache beanPostProcessorCache ;
165
165
166
166
/** Map from scope identifier String to corresponding Scope. */
167
167
private final Map <String , Scope > scopes = new LinkedHashMap <>(8 );
@@ -944,10 +944,12 @@ public String resolveEmbeddedValue(@Nullable String value) {
944
944
@ Override
945
945
public void addBeanPostProcessor (BeanPostProcessor beanPostProcessor ) {
946
946
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
+ }
951
953
}
952
954
953
955
/**
@@ -957,8 +959,12 @@ public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
957
959
* @see #addBeanPostProcessor
958
960
*/
959
961
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
+ }
962
968
}
963
969
964
970
@ Override
@@ -980,26 +986,34 @@ public List<BeanPostProcessor> getBeanPostProcessors() {
980
986
* @since 5.3
981
987
*/
982
988
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 );
991
1005
}
992
1006
}
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 ;
999
1008
}
1000
- this .beanPostProcessorCache = bpCache ;
1009
+ return bppCache ;
1010
+ }
1011
+ }
1012
+
1013
+ private void resetBeanPostProcessorCache () {
1014
+ synchronized (this .beanPostProcessors ) {
1015
+ this .beanPostProcessorCache = null ;
1001
1016
}
1002
- return bpCache ;
1003
1017
}
1004
1018
1005
1019
/**
@@ -2014,35 +2028,35 @@ private class BeanPostProcessorCacheAwareList extends CopyOnWriteArrayList<BeanP
2014
2028
@ Override
2015
2029
public BeanPostProcessor set (int index , BeanPostProcessor element ) {
2016
2030
BeanPostProcessor result = super .set (index , element );
2017
- beanPostProcessorCache = null ;
2031
+ resetBeanPostProcessorCache () ;
2018
2032
return result ;
2019
2033
}
2020
2034
2021
2035
@ Override
2022
2036
public boolean add (BeanPostProcessor o ) {
2023
2037
boolean success = super .add (o );
2024
- beanPostProcessorCache = null ;
2038
+ resetBeanPostProcessorCache () ;
2025
2039
return success ;
2026
2040
}
2027
2041
2028
2042
@ Override
2029
2043
public void add (int index , BeanPostProcessor element ) {
2030
2044
super .add (index , element );
2031
- beanPostProcessorCache = null ;
2045
+ resetBeanPostProcessorCache () ;
2032
2046
}
2033
2047
2034
2048
@ Override
2035
2049
public BeanPostProcessor remove (int index ) {
2036
2050
BeanPostProcessor result = super .remove (index );
2037
- beanPostProcessorCache = null ;
2051
+ resetBeanPostProcessorCache () ;
2038
2052
return result ;
2039
2053
}
2040
2054
2041
2055
@ Override
2042
2056
public boolean remove (Object o ) {
2043
2057
boolean success = super .remove (o );
2044
2058
if (success ) {
2045
- beanPostProcessorCache = null ;
2059
+ resetBeanPostProcessorCache () ;
2046
2060
}
2047
2061
return success ;
2048
2062
}
@@ -2051,7 +2065,7 @@ public boolean remove(Object o) {
2051
2065
public boolean removeAll (Collection <?> c ) {
2052
2066
boolean success = super .removeAll (c );
2053
2067
if (success ) {
2054
- beanPostProcessorCache = null ;
2068
+ resetBeanPostProcessorCache () ;
2055
2069
}
2056
2070
return success ;
2057
2071
}
@@ -2060,7 +2074,7 @@ public boolean removeAll(Collection<?> c) {
2060
2074
public boolean retainAll (Collection <?> c ) {
2061
2075
boolean success = super .retainAll (c );
2062
2076
if (success ) {
2063
- beanPostProcessorCache = null ;
2077
+ resetBeanPostProcessorCache () ;
2064
2078
}
2065
2079
return success ;
2066
2080
}
@@ -2069,7 +2083,7 @@ public boolean retainAll(Collection<?> c) {
2069
2083
public boolean addAll (Collection <? extends BeanPostProcessor > c ) {
2070
2084
boolean success = super .addAll (c );
2071
2085
if (success ) {
2072
- beanPostProcessorCache = null ;
2086
+ resetBeanPostProcessorCache () ;
2073
2087
}
2074
2088
return success ;
2075
2089
}
@@ -2078,7 +2092,7 @@ public boolean addAll(Collection<? extends BeanPostProcessor> c) {
2078
2092
public boolean addAll (int index , Collection <? extends BeanPostProcessor > c ) {
2079
2093
boolean success = super .addAll (index , c );
2080
2094
if (success ) {
2081
- beanPostProcessorCache = null ;
2095
+ resetBeanPostProcessorCache () ;
2082
2096
}
2083
2097
return success ;
2084
2098
}
@@ -2087,15 +2101,15 @@ public boolean addAll(int index, Collection<? extends BeanPostProcessor> c) {
2087
2101
public boolean removeIf (Predicate <? super BeanPostProcessor > filter ) {
2088
2102
boolean success = super .removeIf (filter );
2089
2103
if (success ) {
2090
- beanPostProcessorCache = null ;
2104
+ resetBeanPostProcessorCache () ;
2091
2105
}
2092
2106
return success ;
2093
2107
}
2094
2108
2095
2109
@ Override
2096
2110
public void replaceAll (UnaryOperator <BeanPostProcessor > operator ) {
2097
2111
super .replaceAll (operator );
2098
- beanPostProcessorCache = null ;
2112
+ resetBeanPostProcessorCache () ;
2099
2113
}
2100
2114
}
2101
2115
0 commit comments