@@ -386,15 +386,8 @@ public void registerDisposableBean(String beanName, DisposableBean bean) {
386
386
* @see #registerDependentBean
387
387
*/
388
388
public void registerContainedBean (String containedBeanName , String containingBeanName ) {
389
- // A quick check for an existing entry upfront, avoiding synchronization...
390
- Set <String > containedBeans = this .containedBeanMap .get (containingBeanName );
391
- if (containedBeans != null && containedBeans .contains (containedBeanName )) {
392
- return ;
393
- }
394
-
395
- // No entry yet -> fully synchronized manipulation of the containedBeans Set
396
389
synchronized (this .containedBeanMap ) {
397
- containedBeans = this .containedBeanMap .get (containingBeanName );
390
+ Set < String > containedBeans = this .containedBeanMap .get (containingBeanName );
398
391
if (containedBeans == null ) {
399
392
containedBeans = new LinkedHashSet <String >(8 );
400
393
this .containedBeanMap .put (containingBeanName , containedBeans );
@@ -411,16 +404,10 @@ public void registerContainedBean(String containedBeanName, String containingBea
411
404
* @param dependentBeanName the name of the dependent bean
412
405
*/
413
406
public void registerDependentBean (String beanName , String dependentBeanName ) {
414
- // A quick check for an existing entry upfront, avoiding synchronization...
415
407
String canonicalName = canonicalName (beanName );
416
- Set <String > dependentBeans = this .dependentBeanMap .get (canonicalName );
417
- if (dependentBeans != null && dependentBeans .contains (dependentBeanName )) {
418
- return ;
419
- }
420
408
421
- // No entry yet -> fully synchronized manipulation of the dependentBeans Set
422
409
synchronized (this .dependentBeanMap ) {
423
- dependentBeans = this .dependentBeanMap .get (canonicalName );
410
+ Set < String > dependentBeans = this .dependentBeanMap .get (canonicalName );
424
411
if (dependentBeans == null ) {
425
412
dependentBeans = new LinkedHashSet <String >(8 );
426
413
this .dependentBeanMap .put (canonicalName , dependentBeans );
@@ -445,7 +432,9 @@ public void registerDependentBean(String beanName, String dependentBeanName) {
445
432
* @since 4.0
446
433
*/
447
434
protected boolean isDependent (String beanName , String dependentBeanName ) {
448
- return isDependent (beanName , dependentBeanName , null );
435
+ synchronized (this .dependentBeanMap ) {
436
+ return isDependent (beanName , dependentBeanName , null );
437
+ }
449
438
}
450
439
451
440
private boolean isDependent (String beanName , String dependentBeanName , Set <String > alreadySeen ) {
@@ -490,7 +479,9 @@ public String[] getDependentBeans(String beanName) {
490
479
if (dependentBeans == null ) {
491
480
return new String [0 ];
492
481
}
493
- return StringUtils .toStringArray (dependentBeans );
482
+ synchronized (this .dependentBeanMap ) {
483
+ return StringUtils .toStringArray (dependentBeans );
484
+ }
494
485
}
495
486
496
487
/**
@@ -504,7 +495,9 @@ public String[] getDependenciesForBean(String beanName) {
504
495
if (dependenciesForBean == null ) {
505
496
return new String [0 ];
506
497
}
507
- return StringUtils .toStringArray (dependenciesForBean );
498
+ synchronized (this .dependenciesForBeanMap ) {
499
+ return StringUtils .toStringArray (dependenciesForBean );
500
+ }
508
501
}
509
502
510
503
public void destroySingletons () {
@@ -527,6 +520,14 @@ public void destroySingletons() {
527
520
this .dependentBeanMap .clear ();
528
521
this .dependenciesForBeanMap .clear ();
529
522
523
+ clearSingletonCache ();
524
+ }
525
+
526
+ /**
527
+ * Clear all cached singleton instances in this registry.
528
+ * @since 4.3.15
529
+ */
530
+ protected void clearSingletonCache () {
530
531
synchronized (this .singletonObjects ) {
531
532
this .singletonObjects .clear ();
532
533
this .singletonFactories .clear ();
@@ -562,7 +563,11 @@ public void destroySingleton(String beanName) {
562
563
*/
563
564
protected void destroyBean (String beanName , DisposableBean bean ) {
564
565
// Trigger destruction of dependent beans first...
565
- Set <String > dependencies = this .dependentBeanMap .remove (beanName );
566
+ Set <String > dependencies ;
567
+ synchronized (this .dependentBeanMap ) {
568
+ // Within full synchronization in order to guarantee a disconnected Set
569
+ dependencies = this .dependentBeanMap .remove (beanName );
570
+ }
566
571
if (dependencies != null ) {
567
572
if (logger .isDebugEnabled ()) {
568
573
logger .debug ("Retrieved dependent beans for bean '" + beanName + "': " + dependencies );
@@ -583,7 +588,11 @@ protected void destroyBean(String beanName, DisposableBean bean) {
583
588
}
584
589
585
590
// Trigger destruction of contained beans...
586
- Set <String > containedBeans = this .containedBeanMap .remove (beanName );
591
+ Set <String > containedBeans ;
592
+ synchronized (this .containedBeanMap ) {
593
+ // Within full synchronization in order to guarantee a disconnected Set
594
+ containedBeans = this .containedBeanMap .remove (beanName );
595
+ }
587
596
if (containedBeans != null ) {
588
597
for (String containedBeanName : containedBeans ) {
589
598
destroySingleton (containedBeanName );
0 commit comments