@@ -58,55 +58,126 @@ public void twoLevelsDeep() {
58
58
ctx .register (L0Config .class );
59
59
ctx .refresh ();
60
60
61
+ assertFalse (ctx .getBeanFactory ().containsSingleton ("nestedConfigurationClassTests.L0Config" ));
61
62
ctx .getBean (L0Config .class );
62
63
ctx .getBean ("l0Bean" );
63
64
65
+ assertTrue (ctx .getBeanFactory ().containsSingleton (L0Config .L1Config .class .getName ()));
64
66
ctx .getBean (L0Config .L1Config .class );
65
67
ctx .getBean ("l1Bean" );
66
68
69
+ assertFalse (ctx .getBeanFactory ().containsSingleton (L0Config .L1Config .L2Config .class .getName ()));
67
70
ctx .getBean (L0Config .L1Config .L2Config .class );
68
71
ctx .getBean ("l2Bean" );
69
72
70
73
// ensure that override order is correct
71
74
assertThat (ctx .getBean ("overrideBean" , TestBean .class ).getName (), is ("override-l0" ));
72
75
}
73
76
77
+ @ Test
78
+ public void twoLevelsInLiteMode () {
79
+ AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext ();
80
+ ctx .register (L0ConfigLight .class );
81
+ ctx .refresh ();
82
+
83
+ assertFalse (ctx .getBeanFactory ().containsSingleton ("nestedConfigurationClassTests.L0ConfigLight" ));
84
+ ctx .getBean (L0ConfigLight .class );
85
+ ctx .getBean ("l0Bean" );
86
+
87
+ assertTrue (ctx .getBeanFactory ().containsSingleton (L0ConfigLight .L1ConfigLight .class .getName ()));
88
+ ctx .getBean (L0ConfigLight .L1ConfigLight .class );
89
+ ctx .getBean ("l1Bean" );
90
+
91
+ assertFalse (ctx .getBeanFactory ().containsSingleton (L0ConfigLight .L1ConfigLight .L2ConfigLight .class .getName ()));
92
+ ctx .getBean (L0ConfigLight .L1ConfigLight .L2ConfigLight .class );
93
+ ctx .getBean ("l2Bean" );
94
+
95
+ // ensure that override order is correct
96
+ assertThat (ctx .getBean ("overrideBean" , TestBean .class ).getName (), is ("override-l0" ));
97
+ }
98
+
74
99
@ Test
75
100
public void twoLevelsDeepWithInheritance () {
76
101
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext ();
77
102
ctx .register (S1Config .class );
78
103
ctx .refresh ();
79
104
80
- ctx .getBean (S1Config .class );
81
- ctx .getBean ("l0Bean" );
105
+ S1Config config = ctx .getBean (S1Config .class );
106
+ assertTrue (config != ctx .getBean (S1Config .class ));
107
+ TestBean tb = ctx .getBean ("l0Bean" , TestBean .class );
108
+ assertTrue (tb == ctx .getBean ("l0Bean" , TestBean .class ));
82
109
83
110
ctx .getBean (L0Config .L1Config .class );
84
111
ctx .getBean ("l1Bean" );
85
112
86
113
ctx .getBean (L0Config .L1Config .L2Config .class );
87
114
ctx .getBean ("l2Bean" );
88
115
89
- // ensure that override order is correct
90
- assertThat (ctx .getBean ("overrideBean" , TestBean .class ).getName (), is ("override-s1" ));
116
+ // ensure that override order is correct and that it is a singleton
117
+ TestBean ob = ctx .getBean ("overrideBean" , TestBean .class );
118
+ assertThat (ob .getName (), is ("override-s1" ));
119
+ assertTrue (ob == ctx .getBean ("overrideBean" , TestBean .class ));
120
+
121
+ TestBean pb1 = ctx .getBean ("prototypeBean" , TestBean .class );
122
+ TestBean pb2 = ctx .getBean ("prototypeBean" , TestBean .class );
123
+ assertTrue (pb1 != pb2 );
124
+ assertTrue (pb1 .getFriends ().iterator ().next () != pb2 .getFriends ().iterator ().next ());
91
125
}
92
126
93
127
@ Test
94
- public void twoLevelsInLiteMode () {
128
+ public void twoLevelsDeepWithInheritanceThroughImport () {
95
129
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext ();
96
- ctx .register (L0ConfigLight .class );
130
+ ctx .register (S1Importer .class );
97
131
ctx .refresh ();
98
132
99
- ctx .getBean (L0ConfigLight .class );
100
- ctx .getBean ("l0Bean" );
133
+ S1Config config = ctx .getBean (S1Config .class );
134
+ assertTrue (config != ctx .getBean (S1Config .class ));
135
+ TestBean tb = ctx .getBean ("l0Bean" , TestBean .class );
136
+ assertTrue (tb == ctx .getBean ("l0Bean" , TestBean .class ));
101
137
102
- ctx .getBean (L0ConfigLight . L1ConfigLight .class );
138
+ ctx .getBean (L0Config . L1Config .class );
103
139
ctx .getBean ("l1Bean" );
104
140
105
- ctx .getBean (L0ConfigLight . L1ConfigLight . L2ConfigLight .class );
141
+ ctx .getBean (L0Config . L1Config . L2Config .class );
106
142
ctx .getBean ("l2Bean" );
107
143
108
- // ensure that override order is correct
109
- assertThat (ctx .getBean ("overrideBean" , TestBean .class ).getName (), is ("override-l0" ));
144
+ // ensure that override order is correct and that it is a singleton
145
+ TestBean ob = ctx .getBean ("overrideBean" , TestBean .class );
146
+ assertThat (ob .getName (), is ("override-s1" ));
147
+ assertTrue (ob == ctx .getBean ("overrideBean" , TestBean .class ));
148
+
149
+ TestBean pb1 = ctx .getBean ("prototypeBean" , TestBean .class );
150
+ TestBean pb2 = ctx .getBean ("prototypeBean" , TestBean .class );
151
+ assertTrue (pb1 != pb2 );
152
+ assertTrue (pb1 .getFriends ().iterator ().next () != pb2 .getFriends ().iterator ().next ());
153
+ }
154
+
155
+ @ Test
156
+ public void twoLevelsDeepWithInheritanceAndScopedProxy () {
157
+ AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext ();
158
+ ctx .register (S1ImporterWithProxy .class );
159
+ ctx .refresh ();
160
+
161
+ S1ConfigWithProxy config = ctx .getBean (S1ConfigWithProxy .class );
162
+ assertTrue (config == ctx .getBean (S1ConfigWithProxy .class ));
163
+ TestBean tb = ctx .getBean ("l0Bean" , TestBean .class );
164
+ assertTrue (tb == ctx .getBean ("l0Bean" , TestBean .class ));
165
+
166
+ ctx .getBean (L0Config .L1Config .class );
167
+ ctx .getBean ("l1Bean" );
168
+
169
+ ctx .getBean (L0Config .L1Config .L2Config .class );
170
+ ctx .getBean ("l2Bean" );
171
+
172
+ // ensure that override order is correct and that it is a singleton
173
+ TestBean ob = ctx .getBean ("overrideBean" , TestBean .class );
174
+ assertThat (ob .getName (), is ("override-s1" ));
175
+ assertTrue (ob == ctx .getBean ("overrideBean" , TestBean .class ));
176
+
177
+ TestBean pb1 = ctx .getBean ("prototypeBean" , TestBean .class );
178
+ TestBean pb2 = ctx .getBean ("prototypeBean" , TestBean .class );
179
+ assertTrue (pb1 != pb2 );
180
+ assertTrue (pb1 .getFriends ().iterator ().next () != pb2 .getFriends ().iterator ().next ());
110
181
}
111
182
112
183
@ Test
@@ -115,21 +186,34 @@ public void twoLevelsWithNoBeanMethods() {
115
186
ctx .register (L0ConfigEmpty .class );
116
187
ctx .refresh ();
117
188
118
- ctx .getBean (L0ConfigEmpty .class );
119
- ctx .getBean (L0ConfigEmpty .L1ConfigEmpty .class );
120
- ctx .getBean (L0ConfigEmpty .L1ConfigEmpty .L2ConfigEmpty .class );
189
+ assertFalse (ctx .getBeanFactory ().containsSingleton ("l0ConfigEmpty" ));
190
+ Object l0i1 = ctx .getBean (L0ConfigEmpty .class );
191
+ Object l0i2 = ctx .getBean (L0ConfigEmpty .class );
192
+ assertTrue (l0i1 == l0i2 );
193
+
194
+ Object l1i1 = ctx .getBean (L0ConfigEmpty .L1ConfigEmpty .class );
195
+ Object l1i2 = ctx .getBean (L0ConfigEmpty .L1ConfigEmpty .class );
196
+ assertTrue (l1i1 != l1i2 );
197
+
198
+ Object l2i1 = ctx .getBean (L0ConfigEmpty .L1ConfigEmpty .L2ConfigEmpty .class );
199
+ Object l2i2 = ctx .getBean (L0ConfigEmpty .L1ConfigEmpty .L2ConfigEmpty .class );
200
+ assertTrue (l2i1 == l2i2 );
201
+ assertNotEquals (l2i1 .toString (), l2i2 .toString ());
121
202
}
122
203
123
204
124
205
@ Configuration
206
+ @ Lazy
125
207
static class L0Config {
126
208
127
209
@ Bean
210
+ @ Lazy
128
211
public TestBean l0Bean () {
129
212
return new TestBean ("l0" );
130
213
}
131
214
132
215
@ Bean
216
+ @ Lazy
133
217
public TestBean overrideBean () {
134
218
return new TestBean ("override-l0" );
135
219
}
@@ -148,14 +232,17 @@ public TestBean overrideBean() {
148
232
}
149
233
150
234
@ Configuration
235
+ @ Lazy
151
236
protected static class L2Config {
152
237
153
238
@ Bean
239
+ @ Lazy
154
240
public TestBean l2Bean () {
155
241
return new TestBean ("l2" );
156
242
}
157
243
158
244
@ Bean
245
+ @ Lazy
159
246
public TestBean overrideBean () {
160
247
return new TestBean ("override-l2" );
161
248
}
@@ -165,14 +252,17 @@ public TestBean overrideBean() {
165
252
166
253
167
254
@ Component
255
+ @ Lazy
168
256
static class L0ConfigLight {
169
257
170
258
@ Bean
259
+ @ Lazy
171
260
public TestBean l0Bean () {
172
261
return new TestBean ("l0" );
173
262
}
174
263
175
264
@ Bean
265
+ @ Lazy
176
266
public TestBean overrideBean () {
177
267
return new TestBean ("override-l0" );
178
268
}
@@ -191,14 +281,17 @@ public TestBean overrideBean() {
191
281
}
192
282
193
283
@ Component
284
+ @ Lazy
194
285
protected static class L2ConfigLight {
195
286
196
287
@ Bean
288
+ @ Lazy
197
289
public TestBean l2Bean () {
198
290
return new TestBean ("l2" );
199
291
}
200
292
201
293
@ Bean
294
+ @ Lazy
202
295
public TestBean overrideBean () {
203
296
return new TestBean ("override-l2" );
204
297
}
@@ -207,27 +300,69 @@ public TestBean overrideBean() {
207
300
}
208
301
209
302
210
- @ Component
211
- static class L0ConfigEmpty {
303
+ @ Configuration
304
+ @ Scope ("prototype" )
305
+ static class S1Config extends L0Config {
212
306
213
- @ Component
214
- static class L1ConfigEmpty {
307
+ @ Override
308
+ @ Bean
309
+ public TestBean overrideBean () {
310
+ return new TestBean ("override-s1" );
311
+ }
215
312
216
- @ Component
217
- protected static class L2ConfigEmpty {
218
- }
313
+ @ Bean
314
+ @ Scope ("prototype" )
315
+ public TestBean prototypeBean () {
316
+ TestBean tb = new TestBean ("override-s1" );
317
+ tb .getFriends ().add (this );
318
+ return tb ;
219
319
}
220
320
}
221
321
222
322
223
323
@ Configuration
224
- static class S1Config extends L0Config {
324
+ @ Scope (value = "prototype" , proxyMode = ScopedProxyMode .TARGET_CLASS )
325
+ static class S1ConfigWithProxy extends L0Config {
225
326
226
327
@ Override
227
328
@ Bean
228
329
public TestBean overrideBean () {
229
330
return new TestBean ("override-s1" );
230
331
}
332
+
333
+ @ Bean
334
+ @ Scope ("prototype" )
335
+ public TestBean prototypeBean () {
336
+ TestBean tb = new TestBean ("override-s1" );
337
+ tb .getFriends ().add (this );
338
+ return tb ;
339
+ }
340
+ }
341
+
342
+
343
+ @ Import (S1Config .class )
344
+ static class S1Importer {
345
+ }
346
+
347
+
348
+ @ Import (S1ConfigWithProxy .class )
349
+ static class S1ImporterWithProxy {
350
+ }
351
+
352
+
353
+ @ Component
354
+ @ Lazy
355
+ static class L0ConfigEmpty {
356
+
357
+ @ Component
358
+ @ Scope ("prototype" )
359
+ static class L1ConfigEmpty {
360
+
361
+ @ Component
362
+ @ Scope (value = "prototype" , proxyMode = ScopedProxyMode .TARGET_CLASS )
363
+ protected static class L2ConfigEmpty {
364
+ }
365
+ }
231
366
}
232
367
233
368
}
0 commit comments