16
16
17
17
package org .springframework .context .annotation ;
18
18
19
+ import org .junit .Before ;
19
20
import org .junit .Test ;
20
21
22
+ import org .springframework .beans .factory .FactoryBean ;
21
23
import org .springframework .beans .factory .annotation .Autowired ;
22
24
import org .springframework .beans .factory .annotation .AutowiredAnnotationBeanPostProcessor ;
23
25
import org .springframework .beans .factory .annotation .QualifierAnnotationAutowireCandidateResolver ;
31
33
32
34
/**
33
35
* @author Chris Beams
36
+ * @author Juergen Hoeller
34
37
*/
35
38
public class ConfigurationClassPostProcessorTests {
36
39
40
+ private DefaultListableBeanFactory beanFactory ;
41
+
42
+ @ Before
43
+ public void setUp () {
44
+ DefaultListableBeanFactory bf = new DefaultListableBeanFactory ();
45
+ QualifierAnnotationAutowireCandidateResolver acr = new QualifierAnnotationAutowireCandidateResolver ();
46
+ acr .setBeanFactory (bf );
47
+ bf .setAutowireCandidateResolver (acr );
48
+ this .beanFactory = bf ;
49
+ }
50
+
37
51
/**
38
52
* Enhanced {@link Configuration} classes are only necessary for respecting
39
53
* certain bean semantics, like singleton-scoping, scoped proxies, etc.
@@ -45,7 +59,6 @@ public class ConfigurationClassPostProcessorTests {
45
59
*/
46
60
@ Test
47
61
public void testEnhancementIsPresentBecauseSingletonSemanticsAreRespected () {
48
- DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory ();
49
62
beanFactory .registerBeanDefinition ("config" , new RootBeanDefinition (SingletonBeanConfig .class ));
50
63
ConfigurationClassPostProcessor pp = new ConfigurationClassPostProcessor ();
51
64
pp .postProcessBeanFactory (beanFactory );
@@ -60,7 +73,6 @@ public void testEnhancementIsPresentBecauseSingletonSemanticsAreRespected() {
60
73
*/
61
74
@ Test
62
75
public void testAlreadyLoadedConfigurationClasses () {
63
- DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory ();
64
76
beanFactory .registerBeanDefinition ("unloadedConfig" ,
65
77
new RootBeanDefinition (UnloadedConfig .class .getName (), null , null ));
66
78
beanFactory .registerBeanDefinition ("loadedConfig" , new RootBeanDefinition (LoadedConfig .class ));
@@ -76,7 +88,6 @@ public void testAlreadyLoadedConfigurationClasses() {
76
88
*/
77
89
@ Test
78
90
public void testPostProcessorIntrospectsInheritedDefinitionsCorrectly () {
79
- DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory ();
80
91
beanFactory .registerBeanDefinition ("config" , new RootBeanDefinition (SingletonBeanConfig .class ));
81
92
beanFactory .registerBeanDefinition ("parent" , new RootBeanDefinition (TestBean .class ));
82
93
beanFactory .registerBeanDefinition ("child" , new ChildBeanDefinition ("parent" ));
@@ -89,7 +100,6 @@ public void testPostProcessorIntrospectsInheritedDefinitionsCorrectly() {
89
100
90
101
@ Test
91
102
public void testPostProcessorOverridesNonApplicationBeanDefinitions () {
92
- DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory ();
93
103
RootBeanDefinition rbd = new RootBeanDefinition (TestBean .class );
94
104
rbd .setRole (RootBeanDefinition .ROLE_SUPPORT );
95
105
beanFactory .registerBeanDefinition ("bar" , rbd );
@@ -103,7 +113,6 @@ public void testPostProcessorOverridesNonApplicationBeanDefinitions() {
103
113
104
114
@ Test
105
115
public void testPostProcessorDoesNotOverrideRegularBeanDefinitions () {
106
- DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory ();
107
116
RootBeanDefinition rbd = new RootBeanDefinition (TestBean .class );
108
117
rbd .setResource (new DescriptiveResource ("XML or something" ));
109
118
beanFactory .registerBeanDefinition ("bar" , rbd );
@@ -137,32 +146,62 @@ public void testProcessingAllowedOnlyOncePerProcessorRegistryPair() {
137
146
138
147
@ Test
139
148
public void testGenericsBasedInjection () {
140
- DefaultListableBeanFactory bf = new DefaultListableBeanFactory ();
141
- bf .setAutowireCandidateResolver (new QualifierAnnotationAutowireCandidateResolver ());
142
149
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor ();
143
- bpp .setBeanFactory (bf );
144
- bf .addBeanPostProcessor (bpp );
150
+ bpp .setBeanFactory (beanFactory );
151
+ beanFactory .addBeanPostProcessor (bpp );
145
152
RootBeanDefinition bd = new RootBeanDefinition (RepositoryInjectionBean .class );
146
153
bd .setScope (RootBeanDefinition .SCOPE_PROTOTYPE );
147
- bf .registerBeanDefinition ("annotatedBean" , bd );
148
- bf .registerBeanDefinition ("configClass" , new RootBeanDefinition (RepositoryConfiguration .class ));
154
+ beanFactory .registerBeanDefinition ("annotatedBean" , bd );
155
+ beanFactory .registerBeanDefinition ("configClass" , new RootBeanDefinition (RepositoryConfiguration .class ));
156
+ ConfigurationClassPostProcessor pp = new ConfigurationClassPostProcessor ();
157
+ pp .postProcessBeanFactory (beanFactory );
158
+
159
+ RepositoryInjectionBean bean = (RepositoryInjectionBean ) beanFactory .getBean ("annotatedBean" );
160
+ assertSame (beanFactory .getBean ("stringRepo" ), bean .stringRepository );
161
+ assertSame (beanFactory .getBean ("integerRepo" ), bean .integerRepository );
162
+ }
163
+
164
+ @ Test
165
+ public void testGenericsBasedInjectionWithImplTypeAtInjectionPoint () {
166
+ AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor ();
167
+ bpp .setBeanFactory (beanFactory );
168
+ beanFactory .addBeanPostProcessor (bpp );
169
+ RootBeanDefinition bd = new RootBeanDefinition (SpecificRepositoryInjectionBean .class );
170
+ bd .setScope (RootBeanDefinition .SCOPE_PROTOTYPE );
171
+ beanFactory .registerBeanDefinition ("annotatedBean" , bd );
172
+ beanFactory .registerBeanDefinition ("configClass" , new RootBeanDefinition (SpecificRepositoryConfiguration .class ));
173
+ ConfigurationClassPostProcessor pp = new ConfigurationClassPostProcessor ();
174
+ pp .postProcessBeanFactory (beanFactory );
175
+ beanFactory .preInstantiateSingletons ();
176
+
177
+ SpecificRepositoryInjectionBean bean = (SpecificRepositoryInjectionBean ) beanFactory .getBean ("annotatedBean" );
178
+ assertSame (beanFactory .getBean ("genericRepo" ), bean .genericRepository );
179
+ }
180
+
181
+ @ Test
182
+ public void testGenericsBasedInjectionWithFactoryBean () {
183
+ AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor ();
184
+ bpp .setBeanFactory (beanFactory );
185
+ beanFactory .addBeanPostProcessor (bpp );
186
+ RootBeanDefinition bd = new RootBeanDefinition (RepositoryFactoryBeanInjectionBean .class );
187
+ bd .setScope (RootBeanDefinition .SCOPE_PROTOTYPE );
188
+ beanFactory .registerBeanDefinition ("annotatedBean" , bd );
189
+ beanFactory .registerBeanDefinition ("configClass" , new RootBeanDefinition (RepositoryFactoryBeanConfiguration .class ));
149
190
ConfigurationClassPostProcessor pp = new ConfigurationClassPostProcessor ();
150
- pp .postProcessBeanFactory (bf );
191
+ pp .postProcessBeanFactory (beanFactory );
192
+ beanFactory .preInstantiateSingletons ();
151
193
152
- RepositoryInjectionBean bean = (RepositoryInjectionBean ) bf .getBean ("annotatedBean" );
153
- assertSame (bf .getBean ("stringRepo" ), bean .stringRepository );
154
- assertSame (bf .getBean ("integerRepo" ), bean .integerRepository );
194
+ RepositoryFactoryBeanInjectionBean bean = (RepositoryFactoryBeanInjectionBean ) beanFactory .getBean ("annotatedBean" );
195
+ assertSame (beanFactory .getBean ("&repoFactoryBean" ), bean .repositoryFactoryBean );
155
196
}
156
197
157
198
@ Test
158
199
public void testGenericsBasedInjectionWithRawMatch () {
159
- DefaultListableBeanFactory bf = new DefaultListableBeanFactory ();
160
- bf .setAutowireCandidateResolver (new QualifierAnnotationAutowireCandidateResolver ());
161
- bf .registerBeanDefinition ("configClass" , new RootBeanDefinition (RawMatchingConfiguration .class ));
200
+ beanFactory .registerBeanDefinition ("configClass" , new RootBeanDefinition (RawMatchingConfiguration .class ));
162
201
ConfigurationClassPostProcessor pp = new ConfigurationClassPostProcessor ();
163
- pp .postProcessBeanFactory (bf );
202
+ pp .postProcessBeanFactory (beanFactory );
164
203
165
- assertSame (bf .getBean ("repo" ), bf .getBean ("repoConsumer" ));
204
+ assertSame (beanFactory .getBean ("repo" ), beanFactory .getBean ("repoConsumer" ));
166
205
}
167
206
168
207
@@ -215,6 +254,29 @@ public static class Repository<T> {
215
254
}
216
255
217
256
257
+ public static class GenericRepository <T > extends Repository <T > {
258
+ }
259
+
260
+
261
+ public static class RepositoryFactoryBean <T > implements FactoryBean <T > {
262
+
263
+ @ Override
264
+ public T getObject () {
265
+ throw new IllegalStateException ();
266
+ }
267
+
268
+ @ Override
269
+ public Class <?> getObjectType () {
270
+ return Object .class ;
271
+ }
272
+
273
+ @ Override
274
+ public boolean isSingleton () {
275
+ return false ;
276
+ }
277
+ }
278
+
279
+
218
280
public static class RepositoryInjectionBean {
219
281
220
282
@ Autowired
@@ -240,6 +302,40 @@ public Repository<Integer> integerRepo() {
240
302
}
241
303
242
304
305
+ public static class SpecificRepositoryInjectionBean {
306
+
307
+ @ Autowired
308
+ public GenericRepository <?> genericRepository ;
309
+ }
310
+
311
+
312
+ @ Configuration
313
+ public static class SpecificRepositoryConfiguration {
314
+
315
+ @ Bean
316
+ public Repository <Object > genericRepo () {
317
+ return new GenericRepository <Object >();
318
+ }
319
+ }
320
+
321
+
322
+ public static class RepositoryFactoryBeanInjectionBean {
323
+
324
+ @ Autowired
325
+ public RepositoryFactoryBean <?> repositoryFactoryBean ;
326
+ }
327
+
328
+
329
+ @ Configuration
330
+ public static class RepositoryFactoryBeanConfiguration {
331
+
332
+ @ Bean
333
+ public RepositoryFactoryBean <Object > repoFactoryBean () {
334
+ return new RepositoryFactoryBean <>();
335
+ }
336
+ }
337
+
338
+
243
339
@ Configuration
244
340
public static class RawMatchingConfiguration {
245
341
0 commit comments