@@ -109,7 +109,7 @@ public Object resolveValueIfNecessary(Object argName, Object value) {
109
109
}
110
110
else if (value instanceof RuntimeBeanNameReference ) {
111
111
String refName = ((RuntimeBeanNameReference ) value ).getBeanName ();
112
- refName = String .valueOf (evaluate (refName ));
112
+ refName = String .valueOf (doEvaluate (refName ));
113
113
if (!this .beanFactory .containsBean (refName )) {
114
114
throw new BeanDefinitionStoreException (
115
115
"Invalid bean name '" + refName + "' in bean reference for " + argName );
@@ -200,14 +200,6 @@ else if (value instanceof TypedStringValue) {
200
200
"Error converting typed String value for " + argName , ex );
201
201
}
202
202
}
203
- else if (value instanceof String []) {
204
- String [] values = (String []) value ;
205
- Object [] resolvedValues = new Object [values .length ];
206
- for (int i = 0 ; i < values .length ; i ++) {
207
- resolvedValues [i ] = evaluate (values [i ]);
208
- }
209
- return resolvedValues ;
210
- }
211
203
else {
212
204
return evaluate (value );
213
205
}
@@ -219,7 +211,7 @@ else if (value instanceof String[]) {
219
211
* @return the resolved value
220
212
*/
221
213
protected Object evaluate (TypedStringValue value ) {
222
- Object result = this . beanFactory . evaluateBeanDefinitionString (value .getValue (), this . beanDefinition );
214
+ Object result = doEvaluate (value .getValue ());
223
215
if (!ObjectUtils .nullSafeEquals (result , value .getValue ())) {
224
216
value .setDynamic ();
225
217
}
@@ -228,18 +220,41 @@ protected Object evaluate(TypedStringValue value) {
228
220
229
221
/**
230
222
* Evaluate the given value as an expression, if necessary.
231
- * @param value the candidate value (may be an expression)
232
- * @return the resolved value
223
+ * @param value the original value (may be an expression)
224
+ * @return the resolved value if necessary, or the original value
233
225
*/
234
226
protected Object evaluate (Object value ) {
235
227
if (value instanceof String ) {
236
- return this .beanFactory .evaluateBeanDefinitionString ((String ) value , this .beanDefinition );
228
+ return doEvaluate ((String ) value );
229
+ }
230
+ else if (value instanceof String []) {
231
+ String [] values = (String []) value ;
232
+ boolean actuallyResolved = false ;
233
+ Object [] resolvedValues = new Object [values .length ];
234
+ for (int i = 0 ; i < values .length ; i ++) {
235
+ String originalValue = values [i ];
236
+ Object resolvedValue = doEvaluate (originalValue );
237
+ if (resolvedValue != originalValue ) {
238
+ actuallyResolved = true ;
239
+ }
240
+ resolvedValues [i ] = resolvedValue ;
241
+ }
242
+ return (actuallyResolved ? resolvedValues : values );
237
243
}
238
244
else {
239
245
return value ;
240
246
}
241
247
}
242
248
249
+ /**
250
+ * Evaluate the given String value as an expression, if necessary.
251
+ * @param value the original value (may be an expression)
252
+ * @return the resolved value if necessary, or the original String value
253
+ */
254
+ private Object doEvaluate (String value ) {
255
+ return this .beanFactory .evaluateBeanDefinitionString (value , this .beanDefinition );
256
+ }
257
+
243
258
/**
244
259
* Resolve the target type in the given TypedStringValue.
245
260
* @param value the TypedStringValue to resolve
@@ -322,7 +337,7 @@ private String adaptInnerBeanName(String innerBeanName) {
322
337
private Object resolveReference (Object argName , RuntimeBeanReference ref ) {
323
338
try {
324
339
String refName = ref .getBeanName ();
325
- refName = String .valueOf (evaluate (refName ));
340
+ refName = String .valueOf (doEvaluate (refName ));
326
341
if (ref .isToParent ()) {
327
342
if (this .beanFactory .getParentBeanFactory () == null ) {
328
343
throw new BeanCreationException (
0 commit comments