1
1
/*
2
- * Copyright 2002-2008 the original author or authors.
2
+ * Copyright 2002-2009 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
16
16
17
17
package org .springframework .beans .factory .support ;
18
18
19
+ import java .lang .reflect .Array ;
19
20
import java .util .ArrayList ;
20
21
import java .util .LinkedHashMap ;
21
22
import java .util .LinkedHashSet ;
36
37
import org .springframework .beans .factory .config .RuntimeBeanNameReference ;
37
38
import org .springframework .beans .factory .config .RuntimeBeanReference ;
38
39
import org .springframework .beans .factory .config .TypedStringValue ;
40
+ import org .springframework .util .ClassUtils ;
41
+ import org .springframework .util .StringUtils ;
39
42
40
43
/**
41
44
* Helper class for use in bean factory implementations,
@@ -121,6 +124,30 @@ else if (value instanceof BeanDefinition) {
121
124
BeanDefinition bd = (BeanDefinition ) value ;
122
125
return resolveInnerBean (argName , "(inner bean)" , bd );
123
126
}
127
+ else if (value instanceof ManagedArray ) {
128
+ // May need to resolve contained runtime references.
129
+ ManagedArray array = (ManagedArray ) value ;
130
+ Class elementType = array .resolvedElementType ;
131
+ if (elementType == null ) {
132
+ String elementTypeName = array .getElementTypeName ();
133
+ if (StringUtils .hasText (elementTypeName )) {
134
+ try {
135
+ elementType = ClassUtils .forName (elementTypeName , this .beanFactory .getBeanClassLoader ());
136
+ array .resolvedElementType = elementType ;
137
+ }
138
+ catch (Throwable ex ) {
139
+ // Improve the message by showing the context.
140
+ throw new BeanCreationException (
141
+ this .beanDefinition .getResourceDescription (), this .beanName ,
142
+ "Error resolving array type for " + argName , ex );
143
+ }
144
+ }
145
+ else {
146
+ elementType = Object .class ;
147
+ }
148
+ }
149
+ return resolveManagedArray (argName , (List <?>) value , elementType );
150
+ }
124
151
else if (value instanceof ManagedList ) {
125
152
// May need to resolve contained runtime references.
126
153
return resolveManagedList (argName , (List <?>) value );
@@ -292,7 +319,21 @@ private Object resolveReference(Object argName, RuntimeBeanReference ref) {
292
319
}
293
320
294
321
/**
295
- * For each element in the ManagedList, resolve reference if necessary.
322
+ * For each element in the managed array, resolve reference if necessary.
323
+ */
324
+ private Object resolveManagedArray (Object argName , List <?> ml , Class elementType ) {
325
+ Object resolved = Array .newInstance (elementType , ml .size ());
326
+ for (int i = 0 ; i < ml .size (); i ++) {
327
+ Array .set (resolved , i ,
328
+ resolveValueIfNecessary (
329
+ argName + " with key " + BeanWrapper .PROPERTY_KEY_PREFIX + i + BeanWrapper .PROPERTY_KEY_SUFFIX ,
330
+ ml .get (i )));
331
+ }
332
+ return resolved ;
333
+ }
334
+
335
+ /**
336
+ * For each element in the managed list, resolve reference if necessary.
296
337
*/
297
338
private List resolveManagedList (Object argName , List <?> ml ) {
298
339
List <Object > resolved = new ArrayList <Object >(ml .size ());
@@ -306,7 +347,7 @@ private List resolveManagedList(Object argName, List<?> ml) {
306
347
}
307
348
308
349
/**
309
- * For each element in the ManagedList , resolve reference if necessary.
350
+ * For each element in the managed set , resolve reference if necessary.
310
351
*/
311
352
private Set resolveManagedSet (Object argName , Set <?> ms ) {
312
353
Set <Object > resolved = new LinkedHashSet <Object >(ms .size ());
@@ -320,7 +361,7 @@ private Set resolveManagedSet(Object argName, Set<?> ms) {
320
361
}
321
362
322
363
/**
323
- * For each element in the ManagedMap , resolve reference if necessary.
364
+ * For each element in the managed map , resolve reference if necessary.
324
365
*/
325
366
private Map resolveManagedMap (Object argName , Map <?, ?> mm ) {
326
367
Map <Object , Object > resolved = new LinkedHashMap <Object , Object >(mm .size ());
0 commit comments