Skip to content

Commit e48c315

Browse files
committed
DefaultSingletonBeanRegistry performs non-synchronized checks for existing entries in dependentBeanMap and containedBeanMap
Also adding alias resolution to isDependent's algorithm (for circular dependency detection). Issue: SPR-8834 Issue: SPR-7966
1 parent 592e344 commit e48c315

File tree

1 file changed

+18
-3
lines changed

1 file changed

+18
-3
lines changed

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

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -373,8 +373,15 @@ public void registerDisposableBean(String beanName, DisposableBean bean) {
373373
* @see #registerDependentBean
374374
*/
375375
public void registerContainedBean(String containedBeanName, String containingBeanName) {
376+
// A quick check for an existing entry upfront, avoiding synchronization...
377+
Set<String> containedBeans = this.containedBeanMap.get(containingBeanName);
378+
if (containedBeans != null && containedBeans.contains(containedBeanName)) {
379+
return;
380+
}
381+
382+
// No entry yet -> fully synchronized manipulation of the dependentBeans Set
376383
synchronized (this.containedBeanMap) {
377-
Set<String> containedBeans = this.containedBeanMap.get(containingBeanName);
384+
containedBeans = this.containedBeanMap.get(containingBeanName);
378385
if (containedBeans == null) {
379386
containedBeans = new LinkedHashSet<String>(8);
380387
this.containedBeanMap.put(containingBeanName, containedBeans);
@@ -391,9 +398,16 @@ public void registerContainedBean(String containedBeanName, String containingBea
391398
* @param dependentBeanName the name of the dependent bean
392399
*/
393400
public void registerDependentBean(String beanName, String dependentBeanName) {
401+
// A quick check for an existing entry upfront, avoiding synchronization...
394402
String canonicalName = canonicalName(beanName);
403+
Set<String> dependentBeans = this.dependentBeanMap.get(canonicalName);
404+
if (dependentBeans != null && dependentBeans.contains(dependentBeanName)) {
405+
return;
406+
}
407+
408+
// No entry yet -> fully synchronized manipulation of the dependentBeans Set
395409
synchronized (this.dependentBeanMap) {
396-
Set<String> dependentBeans = this.dependentBeanMap.get(canonicalName);
410+
dependentBeans = this.dependentBeanMap.get(canonicalName);
397411
if (dependentBeans == null) {
398412
dependentBeans = new LinkedHashSet<String>(8);
399413
this.dependentBeanMap.put(canonicalName, dependentBeans);
@@ -417,7 +431,8 @@ public void registerDependentBean(String beanName, String dependentBeanName) {
417431
* @param dependentBeanName the name of the dependent bean
418432
*/
419433
protected boolean isDependent(String beanName, String dependentBeanName) {
420-
Set<String> dependentBeans = this.dependentBeanMap.get(beanName);
434+
String canonicalName = canonicalName(beanName);
435+
Set<String> dependentBeans = this.dependentBeanMap.get(canonicalName);
421436
if (dependentBeans == null) {
422437
return false;
423438
}

0 commit comments

Comments
 (0)