Skip to content

Commit e03abc9

Browse files
committed
Merge branch '5.3.x'
# Conflicts: # spring-beans/src/main/java/org/springframework/beans/CachedIntrospectionResults.java # spring-beans/src/main/java/org/springframework/beans/PropertyDescriptorUtils.java # spring-beans/src/main/java/org/springframework/beans/SimpleBeanInfoFactory.java # spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java
2 parents 69cb68f + 33023b2 commit e03abc9

File tree

3 files changed

+56
-36
lines changed

3 files changed

+56
-36
lines changed

spring-beans/src/main/java/org/springframework/beans/PropertyDescriptorUtils.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ abstract class PropertyDescriptorUtils {
4848
* @param beanClass the target class to introspect
4949
* @return a collection of property descriptors
5050
* @throws IntrospectionException from introspecting the given bean class
51-
* @since 6.0
51+
* @since 5.3.24
5252
* @see SimpleBeanInfoFactory
5353
* @see java.beans.Introspector#getBeanInfo(Class)
5454
*/
@@ -57,6 +57,7 @@ public static Collection<PropertyDescriptor> determineBasicProperties(Class<?> b
5757

5858
for (Method method : beanClass.getMethods()) {
5959
String methodName = method.getName();
60+
6061
boolean setter;
6162
int nameIndex;
6263
if (methodName.startsWith("set") && method.getParameterCount() == 1) {
@@ -76,6 +77,10 @@ else if (methodName.startsWith("is") && method.getParameterCount() == 0 && metho
7677
}
7778

7879
String propertyName = StringUtils.uncapitalizeAsProperty(methodName.substring(nameIndex));
80+
if (propertyName.isEmpty()) {
81+
continue;
82+
}
83+
7984
PropertyDescriptor pd = pdMap.get(propertyName);
8085
if (pd != null) {
8186
if (setter) {
@@ -262,6 +267,7 @@ public static boolean equals(PropertyDescriptor pd, PropertyDescriptor otherPd)
262267
* PropertyDescriptor for {@link #determineBasicProperties(Class)},
263268
* not performing any early type determination for
264269
* {@link #setReadMethod}/{@link #setWriteMethod}.
270+
* @since 5.3.24
265271
*/
266272
private static class BasicPropertyDescriptor extends PropertyDescriptor {
267273

spring-beans/src/main/java/org/springframework/beans/SimpleBeanInfoFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
* {@link BeanInfoFactory} types to take precedence.
4040
*
4141
* @author Juergen Hoeller
42-
* @since 6.0
42+
* @since 5.3.24
4343
* @see ExtendedBeanInfoFactory
4444
* @see CachedIntrospectionResults
4545
*/

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
@@ -157,7 +157,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
157157

158158
/** Cache of pre-filtered post-processors. */
159159
@Nullable
160-
private volatile BeanPostProcessorCache beanPostProcessorCache;
160+
private BeanPostProcessorCache beanPostProcessorCache;
161161

162162
/** Map from scope identifier String to corresponding Scope. */
163163
private final Map<String, Scope> scopes = new LinkedHashMap<>(8);
@@ -926,10 +926,12 @@ public String resolveEmbeddedValue(@Nullable String value) {
926926
@Override
927927
public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
928928
Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
929-
// Remove from old position, if any
930-
this.beanPostProcessors.remove(beanPostProcessor);
931-
// Add to end of list
932-
this.beanPostProcessors.add(beanPostProcessor);
929+
synchronized (this.beanPostProcessors) {
930+
// Remove from old position, if any
931+
this.beanPostProcessors.remove(beanPostProcessor);
932+
// Add to end of list
933+
this.beanPostProcessors.add(beanPostProcessor);
934+
}
933935
}
934936

935937
/**
@@ -939,8 +941,12 @@ public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
939941
* @see #addBeanPostProcessor
940942
*/
941943
public void addBeanPostProcessors(Collection<? extends BeanPostProcessor> beanPostProcessors) {
942-
this.beanPostProcessors.removeAll(beanPostProcessors);
943-
this.beanPostProcessors.addAll(beanPostProcessors);
944+
synchronized (this.beanPostProcessors) {
945+
// Remove from old position, if any
946+
this.beanPostProcessors.removeAll(beanPostProcessors);
947+
// Add to end of list
948+
this.beanPostProcessors.addAll(beanPostProcessors);
949+
}
944950
}
945951

946952
@Override
@@ -962,26 +968,34 @@ public List<BeanPostProcessor> getBeanPostProcessors() {
962968
* @since 5.3
963969
*/
964970
BeanPostProcessorCache getBeanPostProcessorCache() {
965-
BeanPostProcessorCache bppCache = this.beanPostProcessorCache;
966-
if (bppCache == null) {
967-
bppCache = new BeanPostProcessorCache();
968-
for (BeanPostProcessor bpp : this.beanPostProcessors) {
969-
if (bpp instanceof InstantiationAwareBeanPostProcessor instantiationAwareBpp) {
970-
bppCache.instantiationAware.add(instantiationAwareBpp);
971-
if (bpp instanceof SmartInstantiationAwareBeanPostProcessor smartInstantiationAwareBpp) {
972-
bppCache.smartInstantiationAware.add(smartInstantiationAwareBpp);
971+
synchronized (this.beanPostProcessors) {
972+
BeanPostProcessorCache bppCache = this.beanPostProcessorCache;
973+
if (bppCache == null) {
974+
bppCache = new BeanPostProcessorCache();
975+
for (BeanPostProcessor bpp : this.beanPostProcessors) {
976+
if (bpp instanceof InstantiationAwareBeanPostProcessor instantiationAwareBpp) {
977+
bppCache.instantiationAware.add(instantiationAwareBpp);
978+
if (bpp instanceof SmartInstantiationAwareBeanPostProcessor smartInstantiationAwareBpp) {
979+
bppCache.smartInstantiationAware.add(smartInstantiationAwareBpp);
980+
}
981+
}
982+
if (bpp instanceof DestructionAwareBeanPostProcessor destructionAwareBpp) {
983+
bppCache.destructionAware.add(destructionAwareBpp);
984+
}
985+
if (bpp instanceof MergedBeanDefinitionPostProcessor mergedBeanDefBpp) {
986+
bppCache.mergedDefinition.add(mergedBeanDefBpp);
973987
}
974988
}
975-
if (bpp instanceof DestructionAwareBeanPostProcessor destructionAwareBpp) {
976-
bppCache.destructionAware.add(destructionAwareBpp);
977-
}
978-
if (bpp instanceof MergedBeanDefinitionPostProcessor mergedBeanDefBpp) {
979-
bppCache.mergedDefinition.add(mergedBeanDefBpp);
980-
}
989+
this.beanPostProcessorCache = bppCache;
981990
}
982-
this.beanPostProcessorCache = bppCache;
991+
return bppCache;
992+
}
993+
}
994+
995+
private void resetBeanPostProcessorCache() {
996+
synchronized (this.beanPostProcessors) {
997+
this.beanPostProcessorCache = null;
983998
}
984-
return bppCache;
985999
}
9861000

9871001
/**
@@ -1937,35 +1951,35 @@ private class BeanPostProcessorCacheAwareList extends CopyOnWriteArrayList<BeanP
19371951
@Override
19381952
public BeanPostProcessor set(int index, BeanPostProcessor element) {
19391953
BeanPostProcessor result = super.set(index, element);
1940-
beanPostProcessorCache = null;
1954+
resetBeanPostProcessorCache();
19411955
return result;
19421956
}
19431957

19441958
@Override
19451959
public boolean add(BeanPostProcessor o) {
19461960
boolean success = super.add(o);
1947-
beanPostProcessorCache = null;
1961+
resetBeanPostProcessorCache();
19481962
return success;
19491963
}
19501964

19511965
@Override
19521966
public void add(int index, BeanPostProcessor element) {
19531967
super.add(index, element);
1954-
beanPostProcessorCache = null;
1968+
resetBeanPostProcessorCache();
19551969
}
19561970

19571971
@Override
19581972
public BeanPostProcessor remove(int index) {
19591973
BeanPostProcessor result = super.remove(index);
1960-
beanPostProcessorCache = null;
1974+
resetBeanPostProcessorCache();
19611975
return result;
19621976
}
19631977

19641978
@Override
19651979
public boolean remove(Object o) {
19661980
boolean success = super.remove(o);
19671981
if (success) {
1968-
beanPostProcessorCache = null;
1982+
resetBeanPostProcessorCache();
19691983
}
19701984
return success;
19711985
}
@@ -1974,7 +1988,7 @@ public boolean remove(Object o) {
19741988
public boolean removeAll(Collection<?> c) {
19751989
boolean success = super.removeAll(c);
19761990
if (success) {
1977-
beanPostProcessorCache = null;
1991+
resetBeanPostProcessorCache();
19781992
}
19791993
return success;
19801994
}
@@ -1983,7 +1997,7 @@ public boolean removeAll(Collection<?> c) {
19831997
public boolean retainAll(Collection<?> c) {
19841998
boolean success = super.retainAll(c);
19851999
if (success) {
1986-
beanPostProcessorCache = null;
2000+
resetBeanPostProcessorCache();
19872001
}
19882002
return success;
19892003
}
@@ -1992,7 +2006,7 @@ public boolean retainAll(Collection<?> c) {
19922006
public boolean addAll(Collection<? extends BeanPostProcessor> c) {
19932007
boolean success = super.addAll(c);
19942008
if (success) {
1995-
beanPostProcessorCache = null;
2009+
resetBeanPostProcessorCache();
19962010
}
19972011
return success;
19982012
}
@@ -2001,7 +2015,7 @@ public boolean addAll(Collection<? extends BeanPostProcessor> c) {
20012015
public boolean addAll(int index, Collection<? extends BeanPostProcessor> c) {
20022016
boolean success = super.addAll(index, c);
20032017
if (success) {
2004-
beanPostProcessorCache = null;
2018+
resetBeanPostProcessorCache();
20052019
}
20062020
return success;
20072021
}
@@ -2010,15 +2024,15 @@ public boolean addAll(int index, Collection<? extends BeanPostProcessor> c) {
20102024
public boolean removeIf(Predicate<? super BeanPostProcessor> filter) {
20112025
boolean success = super.removeIf(filter);
20122026
if (success) {
2013-
beanPostProcessorCache = null;
2027+
resetBeanPostProcessorCache();
20142028
}
20152029
return success;
20162030
}
20172031

20182032
@Override
20192033
public void replaceAll(UnaryOperator<BeanPostProcessor> operator) {
20202034
super.replaceAll(operator);
2021-
beanPostProcessorCache = null;
2035+
resetBeanPostProcessorCache();
20222036
}
20232037
}
20242038

0 commit comments

Comments
 (0)