@@ -576,35 +576,36 @@ public void preInstantiateSingletons() throws BeansException {
576
576
if (this .logger .isInfoEnabled ()) {
577
577
this .logger .info ("Pre-instantiating singletons in " + this );
578
578
}
579
+ List <String > beanNames ;
579
580
synchronized (this .beanDefinitionMap ) {
580
581
// Iterate over a copy to allow for init methods which in turn register new bean definitions.
581
582
// While this may not be part of the regular factory bootstrap, it does otherwise work fine.
582
- List <String > beanNames = new ArrayList <String >(this .beanDefinitionNames );
583
- for (String beanName : beanNames ) {
584
- RootBeanDefinition bd = getMergedLocalBeanDefinition (beanName );
585
- if (!bd .isAbstract () && bd .isSingleton () && !bd .isLazyInit ()) {
586
- if (isFactoryBean (beanName )) {
587
- final FactoryBean <?> factory = (FactoryBean <?>) getBean (FACTORY_BEAN_PREFIX + beanName );
588
- boolean isEagerInit ;
589
- if (System .getSecurityManager () != null && factory instanceof SmartFactoryBean ) {
590
- isEagerInit = AccessController .doPrivileged (new PrivilegedAction <Boolean >() {
591
- public Boolean run () {
592
- return ((SmartFactoryBean <?>) factory ).isEagerInit ();
593
- }
594
- }, getAccessControlContext ());
595
- }
596
- else {
597
- isEagerInit = (factory instanceof SmartFactoryBean &&
598
- ((SmartFactoryBean <?>) factory ).isEagerInit ());
599
- }
600
- if (isEagerInit ) {
601
- getBean (beanName );
602
- }
583
+ beanNames = new ArrayList <String >(this .beanDefinitionNames );
584
+ }
585
+ for (String beanName : beanNames ) {
586
+ RootBeanDefinition bd = getMergedLocalBeanDefinition (beanName );
587
+ if (!bd .isAbstract () && bd .isSingleton () && !bd .isLazyInit ()) {
588
+ if (isFactoryBean (beanName )) {
589
+ final FactoryBean <?> factory = (FactoryBean <?>) getBean (FACTORY_BEAN_PREFIX + beanName );
590
+ boolean isEagerInit ;
591
+ if (System .getSecurityManager () != null && factory instanceof SmartFactoryBean ) {
592
+ isEagerInit = AccessController .doPrivileged (new PrivilegedAction <Boolean >() {
593
+ public Boolean run () {
594
+ return ((SmartFactoryBean <?>) factory ).isEagerInit ();
595
+ }
596
+ }, getAccessControlContext ());
603
597
}
604
598
else {
599
+ isEagerInit = (factory instanceof SmartFactoryBean &&
600
+ ((SmartFactoryBean <?>) factory ).isEagerInit ());
601
+ }
602
+ if (isEagerInit ) {
605
603
getBean (beanName );
606
604
}
607
605
}
606
+ else {
607
+ getBean (beanName );
608
+ }
608
609
}
609
610
}
610
611
}
@@ -650,9 +651,9 @@ public void registerBeanDefinition(String beanName, BeanDefinition beanDefinitio
650
651
this .frozenBeanDefinitionNames = null ;
651
652
}
652
653
this .beanDefinitionMap .put (beanName , beanDefinition );
653
-
654
- resetBeanDefinition (beanName );
655
654
}
655
+
656
+ resetBeanDefinition (beanName );
656
657
}
657
658
658
659
public void removeBeanDefinition (String beanName ) throws NoSuchBeanDefinitionException {
@@ -668,9 +669,9 @@ public void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionExc
668
669
}
669
670
this .beanDefinitionNames .remove (beanName );
670
671
this .frozenBeanDefinitionNames = null ;
671
-
672
- resetBeanDefinition (beanName );
673
672
}
673
+
674
+ resetBeanDefinition (beanName );
674
675
}
675
676
676
677
/**
@@ -685,9 +686,7 @@ protected void resetBeanDefinition(String beanName) {
685
686
// Remove corresponding bean from singleton cache, if any. Shouldn't usually
686
687
// be necessary, rather just meant for overriding a context's default beans
687
688
// (e.g. the default StaticMessageSource in a StaticApplicationContext).
688
- synchronized (getSingletonMutex ()) {
689
- destroySingleton (beanName );
690
- }
689
+ destroySingleton (beanName );
691
690
692
691
// Remove any assumptions about by-type mappings
693
692
this .singletonBeanNamesByType .clear ();
0 commit comments