constructor arguments can be overridden by name in child bean definitions (SPR-6463)

This commit is contained in:
Juergen Hoeller
2009-11-30 12:17:28 +00:00
parent cc32399878
commit 666700f7f3
3 changed files with 50 additions and 17 deletions

View File

@@ -76,7 +76,7 @@ public class ConstructorArgumentValues {
}
for (ValueHolder valueHolder : other.genericArgumentValues) {
if (!this.genericArgumentValues.contains(valueHolder)) {
this.genericArgumentValues.add(valueHolder.copy());
addOrMergeGenericArgumentValue(valueHolder.copy());
}
}
}
@@ -84,7 +84,7 @@ public class ConstructorArgumentValues {
/**
* Add argument value for the given index in the constructor argument list.
* Add an argument value for the given index in the constructor argument list.
* @param index the index in the constructor argument list
* @param value the argument value
*/
@@ -93,7 +93,7 @@ public class ConstructorArgumentValues {
}
/**
* Add argument value for the given index in the constructor argument list.
* Add an argument value for the given index in the constructor argument list.
* @param index the index in the constructor argument list
* @param value the argument value
* @param type the type of the constructor argument
@@ -103,7 +103,7 @@ public class ConstructorArgumentValues {
}
/**
* Add argument value for the given index in the constructor argument list.
* Add an argument value for the given index in the constructor argument list.
* @param index the index in the constructor argument list
* @param newValue the argument value in the form of a ValueHolder
*/
@@ -114,7 +114,7 @@ public class ConstructorArgumentValues {
}
/**
* Add argument value for the given index in the constructor argument list,
* Add an argument value for the given index in the constructor argument list,
* merging the new value (typically a collection) with the current value
* if demanded: see {@link org.springframework.beans.Mergeable}.
* @param key the index in the constructor argument list
@@ -183,7 +183,7 @@ public class ConstructorArgumentValues {
/**
* Add generic argument value to be matched by type.
* Add a generic argument value to be matched by type.
* <p>Note: A single generic argument value will just be used once,
* rather than matched multiple times.
* @param value the argument value
@@ -193,7 +193,7 @@ public class ConstructorArgumentValues {
}
/**
* Add generic argument value to be matched by type.
* Add a generic argument value to be matched by type.
* <p>Note: A single generic argument value will just be used once,
* rather than matched multiple times.
* @param value the argument value
@@ -204,7 +204,7 @@ public class ConstructorArgumentValues {
}
/**
* Add generic argument value to be matched by type.
* Add a generic argument value to be matched by type or name (if available).
* <p>Note: A single generic argument value will just be used once,
* rather than matched multiple times.
* @param newValue the argument value in the form of a ValueHolder
@@ -215,10 +215,33 @@ public class ConstructorArgumentValues {
public void addGenericArgumentValue(ValueHolder newValue) {
Assert.notNull(newValue, "ValueHolder must not be null");
if (!this.genericArgumentValues.contains(newValue)) {
this.genericArgumentValues.add(newValue);
addOrMergeGenericArgumentValue(newValue);
}
}
/**
* Add a generic argument value, merging the new value (typically a collection)
* with the current value if demanded: see {@link org.springframework.beans.Mergeable}.
* @param newValue the argument value in the form of a ValueHolder
*/
private void addOrMergeGenericArgumentValue(ValueHolder newValue) {
if (newValue.getName() != null) {
for (Iterator<ValueHolder> it = this.genericArgumentValues.iterator(); it.hasNext();) {
ValueHolder currentValue = it.next();
if (newValue.getName().equals(currentValue.getName())) {
if (newValue.getValue() instanceof Mergeable) {
Mergeable mergeable = (Mergeable) newValue.getValue();
if (mergeable.isMergeEnabled()) {
newValue.setValue(mergeable.merge(currentValue.getValue()));
}
}
it.remove();
}
}
}
this.genericArgumentValues.add(newValue);
}
/**
* Look for a generic argument value that matches the given type.
* @param requiredType the type to match
@@ -244,8 +267,8 @@ public class ConstructorArgumentValues {
* resolution process.
* @param requiredType the type to match (can be <code>null</code> to find
* an arbitrary next generic argument value)
* @param requiredName the type to match (can be <code>null</code> to match
* unnamed values only)
* @param requiredName the name to match (can be <code>null</code> to not
* match argument values by name)
* @param usedValueHolders a Set of ValueHolder objects that have already been used
* in the current resolution process and should therefore not be returned again
* @return the ValueHolder for the argument, or <code>null</code> if none found