22
22
import org .springframework .beans .factory .support .RootBeanDefinition ;
23
23
import org .springframework .beans .testfixture .beans .TestBean ;
24
24
25
+ import static org .assertj .core .api .Assertions .assertThat ;
26
+ import static org .assertj .core .api .Assertions .assertThatExceptionOfType ;
27
+
25
28
/**
26
29
* @author Juergen Hoeller
27
30
* @since 6.2
@@ -31,8 +34,10 @@ class BeanFactoryLockingTests {
31
34
@ Test
32
35
void fallbackForThreadDuringInitialization () {
33
36
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory ();
34
- beanFactory .registerBeanDefinition ("bean1" , new RootBeanDefinition (ThreadDuringInitialization .class ));
35
- beanFactory .registerBeanDefinition ("bean2" , new RootBeanDefinition (TestBean .class ));
37
+ beanFactory .registerBeanDefinition ("bean1" ,
38
+ new RootBeanDefinition (ThreadDuringInitialization .class ));
39
+ beanFactory .registerBeanDefinition ("bean2" ,
40
+ new RootBeanDefinition (TestBean .class , () -> new TestBean ("tb" )));
36
41
beanFactory .getBean (ThreadDuringInitialization .class );
37
42
}
38
43
@@ -51,7 +56,12 @@ public void setBeanFactory(BeanFactory beanFactory) {
51
56
@ Override
52
57
public void afterPropertiesSet () throws Exception {
53
58
Thread thread = new Thread (() -> {
54
- beanFactory .getBean (TestBean .class );
59
+ // Fail for circular reference from other thread
60
+ assertThatExceptionOfType (BeanCurrentlyInCreationException .class ).isThrownBy (() ->
61
+ beanFactory .getBean (ThreadDuringInitialization .class ));
62
+ // Leniently create unrelated other bean outside of singleton lock
63
+ assertThat (beanFactory .getBean (TestBean .class ).getName ()).isEqualTo ("tb" );
64
+ // Creation attempt in other thread was successful
55
65
initialized = true ;
56
66
});
57
67
thread .start ();
0 commit comments