16
16
17
17
package org .springframework .context .support ;
18
18
19
+ import org .junit .jupiter .api .AfterEach ;
19
20
import org .junit .jupiter .api .Test ;
20
21
import org .mockito .ArgumentCaptor ;
21
22
31
32
import org .springframework .context .ApplicationContextAware ;
32
33
import org .springframework .core .env .ConfigurableEnvironment ;
33
34
import org .springframework .core .env .Environment ;
35
+ import org .springframework .core .io .ByteArrayResource ;
36
+ import org .springframework .core .io .ClassPathResource ;
37
+ import org .springframework .core .io .FileSystemResource ;
38
+ import org .springframework .core .io .FileSystemResourceLoader ;
39
+ import org .springframework .core .io .FileUrlResource ;
40
+ import org .springframework .core .io .ProtocolResolver ;
41
+ import org .springframework .core .io .Resource ;
42
+ import org .springframework .core .io .ResourceLoader ;
34
43
import org .springframework .core .metrics .jfr .FlightRecorderApplicationStartup ;
35
- import org .springframework .util .ObjectUtils ;
36
44
45
+ import static java .nio .charset .StandardCharsets .UTF_8 ;
37
46
import static org .assertj .core .api .Assertions .assertThat ;
38
47
import static org .assertj .core .api .Assertions .assertThatExceptionOfType ;
39
48
import static org .assertj .core .api .Assertions .assertThatIllegalStateException ;
49
+ import static org .assertj .core .api .InstanceOfAssertFactories .type ;
40
50
import static org .mockito .ArgumentMatchers .any ;
41
51
import static org .mockito .ArgumentMatchers .eq ;
42
52
import static org .mockito .Mockito .mock ;
43
53
import static org .mockito .Mockito .verify ;
44
54
45
55
/**
56
+ * Tests for {@link GenericApplicationContext}.
57
+ *
46
58
* @author Juergen Hoeller
47
59
* @author Chris Beams
48
60
* @author Stephane Nicoll
61
+ * @author Sam Brannen
49
62
*/
50
63
class GenericApplicationContextTests {
51
64
65
+ private final GenericApplicationContext context = new GenericApplicationContext ();
66
+
67
+ @ AfterEach
68
+ void closeContext () {
69
+ context .close ();
70
+ }
71
+
52
72
@ Test
53
73
void getBeanForClass () {
54
- GenericApplicationContext ac = new GenericApplicationContext ();
55
- ac .registerBeanDefinition ("testBean" , new RootBeanDefinition (String .class ));
56
- ac .refresh ();
74
+ context .registerBeanDefinition ("testBean" , new RootBeanDefinition (String .class ));
75
+ context .refresh ();
57
76
58
- assertThat (ac .getBean ("testBean" )).isEqualTo ("" );
59
- assertThat (ac .getBean (String .class )).isSameAs (ac .getBean ("testBean" ));
60
- assertThat (ac .getBean (CharSequence .class )).isSameAs (ac .getBean ("testBean" ));
77
+ assertThat (context .getBean ("testBean" )).isEqualTo ("" );
78
+ assertThat (context .getBean (String .class )).isSameAs (context .getBean ("testBean" ));
79
+ assertThat (context .getBean (CharSequence .class )).isSameAs (context .getBean ("testBean" ));
61
80
62
- assertThatExceptionOfType (NoUniqueBeanDefinitionException .class ).isThrownBy (() ->
63
- ac .getBean (Object .class ));
64
- ac .close ();
81
+ assertThatExceptionOfType (NoUniqueBeanDefinitionException .class )
82
+ .isThrownBy (() -> context .getBean (Object .class ));
65
83
}
66
84
67
85
@ Test
68
86
void withSingletonSupplier () {
69
- GenericApplicationContext ac = new GenericApplicationContext ();
70
- ac .registerBeanDefinition ("testBean" , new RootBeanDefinition (String .class , ac ::toString ));
71
- ac .refresh ();
87
+ context .registerBeanDefinition ("testBean" , new RootBeanDefinition (String .class , context ::toString ));
88
+ context .refresh ();
72
89
73
- assertThat (ac .getBean ("testBean" )).isSameAs (ac .getBean ("testBean" ));
74
- assertThat (ac .getBean (String .class )).isSameAs (ac .getBean ("testBean" ));
75
- assertThat (ac .getBean (CharSequence .class )).isSameAs (ac .getBean ("testBean" ));
76
- assertThat (ac .getBean ("testBean" )).isEqualTo (ac .toString ());
77
- ac .close ();
90
+ assertThat (context .getBean ("testBean" )).isSameAs (context .getBean ("testBean" ));
91
+ assertThat (context .getBean (String .class )).isSameAs (context .getBean ("testBean" ));
92
+ assertThat (context .getBean (CharSequence .class )).isSameAs (context .getBean ("testBean" ));
93
+ assertThat (context .getBean ("testBean" )).isEqualTo (context .toString ());
78
94
}
79
95
80
96
@ Test
81
97
void withScopedSupplier () {
82
- GenericApplicationContext ac = new GenericApplicationContext ();
83
- ac .registerBeanDefinition ("testBean" ,
84
- new RootBeanDefinition (String .class , BeanDefinition .SCOPE_PROTOTYPE , ac ::toString ));
85
- ac .refresh ();
98
+ context .registerBeanDefinition ("testBean" ,
99
+ new RootBeanDefinition (String .class , BeanDefinition .SCOPE_PROTOTYPE , context ::toString ));
100
+ context .refresh ();
86
101
87
- assertThat (ac .getBean ("testBean" )).isNotSameAs (ac .getBean ("testBean" ));
88
- assertThat (ac .getBean (String .class )).isEqualTo (ac .getBean ("testBean" ));
89
- assertThat (ac .getBean (CharSequence .class )).isEqualTo (ac .getBean ("testBean" ));
90
- assertThat (ac .getBean ("testBean" )).isEqualTo (ac .toString ());
91
- ac .close ();
102
+ assertThat (context .getBean ("testBean" )).isNotSameAs (context .getBean ("testBean" ));
103
+ assertThat (context .getBean (String .class )).isEqualTo (context .getBean ("testBean" ));
104
+ assertThat (context .getBean (CharSequence .class )).isEqualTo (context .getBean ("testBean" ));
105
+ assertThat (context .getBean ("testBean" )).isEqualTo (context .toString ());
92
106
}
93
107
94
108
@ Test
95
109
void accessAfterClosing () {
96
- GenericApplicationContext ac = new GenericApplicationContext ();
97
- ac .registerBeanDefinition ("testBean" , new RootBeanDefinition (String .class ));
98
- ac .refresh ();
99
-
100
- assertThat (ac .getBean (String .class )).isSameAs (ac .getBean ("testBean" ));
101
- assertThat (ac .getAutowireCapableBeanFactory ().getBean (String .class )).isSameAs (ac .getAutowireCapableBeanFactory ().getBean ("testBean" ));
110
+ context .registerBeanDefinition ("testBean" , new RootBeanDefinition (String .class ));
111
+ context .refresh ();
102
112
103
- ac .close ();
113
+ assertThat (context .getBean (String .class )).isSameAs (context .getBean ("testBean" ));
114
+ assertThat (context .getAutowireCapableBeanFactory ().getBean (String .class ))
115
+ .isSameAs (context .getAutowireCapableBeanFactory ().getBean ("testBean" ));
104
116
105
- assertThatIllegalStateException ().isThrownBy (() ->
106
- ac .getBean (String .class ));
117
+ context .close ();
107
118
108
- assertThatIllegalStateException ().isThrownBy (() -> {
109
- ac .getAutowireCapableBeanFactory ().getBean ("testBean" );
110
- ac .getAutowireCapableBeanFactory ().getBean (String .class );
111
- });
112
- ac .close ();
119
+ assertThatIllegalStateException ()
120
+ .isThrownBy (() -> context .getBean (String .class ));
121
+ assertThatIllegalStateException ()
122
+ .isThrownBy (() -> context .getAutowireCapableBeanFactory ().getBean (String .class ));
123
+ assertThatIllegalStateException ()
124
+ .isThrownBy (() -> context .getAutowireCapableBeanFactory ().getBean ("testBean" ));
113
125
}
114
126
115
127
@ Test
116
128
void individualBeans () {
117
- GenericApplicationContext context = new GenericApplicationContext ();
118
129
context .registerBean (BeanA .class );
119
130
context .registerBean (BeanB .class );
120
131
context .registerBean (BeanC .class );
@@ -123,12 +134,10 @@ void individualBeans() {
123
134
assertThat (context .getBean (BeanA .class ).b ).isSameAs (context .getBean (BeanB .class ));
124
135
assertThat (context .getBean (BeanA .class ).c ).isSameAs (context .getBean (BeanC .class ));
125
136
assertThat (context .getBean (BeanB .class ).applicationContext ).isSameAs (context );
126
- context .close ();
127
137
}
128
138
129
139
@ Test
130
140
void individualNamedBeans () {
131
- GenericApplicationContext context = new GenericApplicationContext ();
132
141
context .registerBean ("a" , BeanA .class );
133
142
context .registerBean ("b" , BeanB .class );
134
143
context .registerBean ("c" , BeanC .class );
@@ -137,12 +146,10 @@ void individualNamedBeans() {
137
146
assertThat (context .getBean ("a" , BeanA .class ).b ).isSameAs (context .getBean ("b" ));
138
147
assertThat (context .getBean ("a" , BeanA .class ).c ).isSameAs (context .getBean ("c" ));
139
148
assertThat (context .getBean ("b" , BeanB .class ).applicationContext ).isSameAs (context );
140
- context .close ();
141
149
}
142
150
143
151
@ Test
144
152
void individualBeanWithSupplier () {
145
- GenericApplicationContext context = new GenericApplicationContext ();
146
153
context .registerBean (BeanA .class ,
147
154
() -> new BeanA (context .getBean (BeanB .class ), context .getBean (BeanC .class )));
148
155
context .registerBean (BeanB .class , BeanB ::new );
@@ -154,14 +161,14 @@ void individualBeanWithSupplier() {
154
161
assertThat (context .getBean (BeanA .class ).c ).isSameAs (context .getBean (BeanC .class ));
155
162
assertThat (context .getBean (BeanB .class ).applicationContext ).isSameAs (context );
156
163
157
- assertThat (context .getDefaultListableBeanFactory ().getDependentBeans (BeanB .class .getName ())).isEqualTo (new String [] {BeanA .class .getName ()});
158
- assertThat (context .getDefaultListableBeanFactory ().getDependentBeans (BeanC .class .getName ())).isEqualTo (new String [] {BeanA .class .getName ()});
159
- context .close ();
164
+ assertThat (context .getDefaultListableBeanFactory ().getDependentBeans (BeanB .class .getName ()))
165
+ .containsExactly (BeanA .class .getName ());
166
+ assertThat (context .getDefaultListableBeanFactory ().getDependentBeans (BeanC .class .getName ()))
167
+ .containsExactly (BeanA .class .getName ());
160
168
}
161
169
162
170
@ Test
163
171
void individualBeanWithSupplierAndCustomizer () {
164
- GenericApplicationContext context = new GenericApplicationContext ();
165
172
context .registerBean (BeanA .class ,
166
173
() -> new BeanA (context .getBean (BeanB .class ), context .getBean (BeanC .class )),
167
174
bd -> bd .setLazyInit (true ));
@@ -173,12 +180,10 @@ void individualBeanWithSupplierAndCustomizer() {
173
180
assertThat (context .getBean (BeanA .class ).b ).isSameAs (context .getBean (BeanB .class ));
174
181
assertThat (context .getBean (BeanA .class ).c ).isSameAs (context .getBean (BeanC .class ));
175
182
assertThat (context .getBean (BeanB .class ).applicationContext ).isSameAs (context );
176
- context .close ();
177
183
}
178
184
179
185
@ Test
180
186
void individualNamedBeanWithSupplier () {
181
- GenericApplicationContext context = new GenericApplicationContext ();
182
187
context .registerBean ("a" , BeanA .class ,
183
188
() -> new BeanA (context .getBean (BeanB .class ), context .getBean (BeanC .class )));
184
189
context .registerBean ("b" , BeanB .class , BeanB ::new );
@@ -189,12 +194,10 @@ void individualNamedBeanWithSupplier() {
189
194
assertThat (context .getBean (BeanA .class ).b ).isSameAs (context .getBean ("b" , BeanB .class ));
190
195
assertThat (context .getBean ("a" , BeanA .class ).c ).isSameAs (context .getBean ("c" ));
191
196
assertThat (context .getBean ("b" , BeanB .class ).applicationContext ).isSameAs (context );
192
- context .close ();
193
197
}
194
198
195
199
@ Test
196
200
void individualNamedBeanWithSupplierAndCustomizer () {
197
- GenericApplicationContext context = new GenericApplicationContext ();
198
201
context .registerBean ("a" , BeanA .class ,
199
202
() -> new BeanA (context .getBean (BeanB .class ), context .getBean (BeanC .class )),
200
203
bd -> bd .setLazyInit (true ));
@@ -206,33 +209,63 @@ void individualNamedBeanWithSupplierAndCustomizer() {
206
209
assertThat (context .getBean (BeanA .class ).b ).isSameAs (context .getBean ("b" , BeanB .class ));
207
210
assertThat (context .getBean ("a" , BeanA .class ).c ).isSameAs (context .getBean ("c" ));
208
211
assertThat (context .getBean ("b" , BeanB .class ).applicationContext ).isSameAs (context );
209
- context .close ();
210
212
}
211
213
212
214
@ Test
213
215
void individualBeanWithNullReturningSupplier () {
214
- GenericApplicationContext context = new GenericApplicationContext ();
215
216
context .registerBean ("a" , BeanA .class , () -> null );
216
217
context .registerBean ("b" , BeanB .class , BeanB ::new );
217
218
context .registerBean ("c" , BeanC .class , BeanC ::new );
218
219
context .refresh ();
219
220
220
- assertThat (ObjectUtils .containsElement (context .getBeanNamesForType (BeanA .class ), "a" )).isTrue ();
221
- assertThat (ObjectUtils .containsElement (context .getBeanNamesForType (BeanB .class ), "b" )).isTrue ();
222
- assertThat (ObjectUtils .containsElement (context .getBeanNamesForType (BeanC .class ), "c" )).isTrue ();
223
- assertThat (context .getBeansOfType (BeanA .class ).isEmpty ()).isTrue ();
224
- assertThat (context .getBeansOfType (BeanB .class ).values ().iterator ().next ()).isSameAs (context .getBean (BeanB .class ));
225
- assertThat (context .getBeansOfType (BeanC .class ).values ().iterator ().next ()).isSameAs (context .getBean (BeanC .class ));
226
- context .close ();
221
+ assertThat (context .getBeanNamesForType (BeanA .class )).containsExactly ("a" );
222
+ assertThat (context .getBeanNamesForType (BeanB .class )).containsExactly ("b" );
223
+ assertThat (context .getBeanNamesForType (BeanC .class )).containsExactly ("c" );
224
+ assertThat (context .getBeansOfType (BeanA .class )).isEmpty ();
225
+ assertThat (context .getBeansOfType (BeanB .class ).values ().iterator ().next ())
226
+ .isSameAs (context .getBean (BeanB .class ));
227
+ assertThat (context .getBeansOfType (BeanC .class ).values ().iterator ().next ())
228
+ .isSameAs (context .getBean (BeanC .class ));
227
229
}
228
230
229
231
@ Test
230
232
void configureApplicationStartupOnBeanFactory () {
231
233
FlightRecorderApplicationStartup applicationStartup = new FlightRecorderApplicationStartup ();
232
- GenericApplicationContext context = new GenericApplicationContext ();
233
234
context .setApplicationStartup (applicationStartup );
234
235
assertThat (context .getBeanFactory ().getApplicationStartup ()).isEqualTo (applicationStartup );
235
- context .close ();
236
+ }
237
+
238
+ @ Test
239
+ void getResourceWithDefaultResourceLoader () {
240
+ assertGetResourceSemantics (null , ClassPathResource .class );
241
+ }
242
+
243
+ @ Test
244
+ void getResourceWithCustomResourceLoader () {
245
+ assertGetResourceSemantics (new FileSystemResourceLoader (), FileSystemResource .class );
246
+ }
247
+
248
+ private void assertGetResourceSemantics (ResourceLoader resourceLoader , Class <? extends Resource > defaultResouceType ) {
249
+ if (resourceLoader != null ) {
250
+ context .setResourceLoader (resourceLoader );
251
+ }
252
+
253
+ String pingLocation = "ping:foo" ;
254
+ String fileLocation = "file:foo" ;
255
+
256
+ Resource resource = context .getResource (pingLocation );
257
+ assertThat (resource ).isInstanceOf (defaultResouceType );
258
+ resource = context .getResource (fileLocation );
259
+ assertThat (resource ).isInstanceOf (FileUrlResource .class );
260
+
261
+ context .addProtocolResolver (new PingPongProtocolResolver ());
262
+
263
+ resource = context .getResource (pingLocation );
264
+ assertThat (resource ).asInstanceOf (type (ByteArrayResource .class ))
265
+ .extracting (bar -> new String (bar .getByteArray (), UTF_8 ))
266
+ .isEqualTo ("pong:foo" );
267
+ resource = context .getResource (fileLocation );
268
+ assertThat (resource ).isInstanceOf (FileUrlResource .class );
236
269
}
237
270
238
271
@ Test
@@ -455,4 +488,15 @@ protected T createInstance() {
455
488
}
456
489
}
457
490
491
+ static class PingPongProtocolResolver implements ProtocolResolver {
492
+
493
+ @ Override
494
+ public Resource resolve (String location , ResourceLoader resourceLoader ) {
495
+ if (location .startsWith ("ping:" )) {
496
+ return new ByteArrayResource (("pong:" + location .substring (5 )).getBytes (UTF_8 ));
497
+ }
498
+ return null ;
499
+ }
500
+ }
501
+
458
502
}
0 commit comments