可以使用BeanPostProcessor
基礎的解決方案:
public class AdditionalPropertiesBeanPostProcessor
implements BeanPostProcessor{
private Map<String, Map<String, Object>> propertiesMap;
public void setPropertiesMap(
final Map<String, Map<String, Object>> propertiesMap){
this.propertiesMap = propertiesMap;
}
@Override
public Object postProcessBeforeInitialization(final Object bean,
final String beanName) throws BeansException{
final Map<String, Object> props = propertiesMap.get(beanName);
if(props != null){
final BeanWrapper bw = new BeanWrapperImpl(bean);
for(final Entry<String, Object> entry : props.entrySet()){
bw.setPropertyValue(entry.getKey(), entry.getValue());
}
}
return bean;
}
@Override
public Object postProcessAfterInitialization(final Object bean,
final String beanName) throws BeansException{
return bean;
}
}
這是bean定義:
<bean class="foo.bar.AdditionalPropertiesBeanPostProcessor">
<property name="propertiesMap">
<map>
<!-- Reference the bean by name -->
<entry key="yourBeanName">
<map>
<!-- Supports Strings (and other standard types), -->
<entry key="propertyOne" value="abc" />
<!-- Bean references, -->
<entry key="service" value-ref="fooService" />
<!-- and inner beans -->
<entry key="someOtherProperty">
<bean class="foo.bar.SomeBean" />
</entry>
</map>
</entry>
</map>
</property>
</bean>
現在,所有這些Bean的bean的名字可以在地圖中找到將額外填充您指定的屬性。
我不知道這種方法是否可以在各種層次上下文中工作,但是如果定義了處理器的上下文導入了其他上下文,我證實它可以工作。
此解決方案不適用於其他問題,因爲這是關於構造函數注入。該解決方案僅適用於標準的java bean屬性。
您能否提供一些示例XML來更好地說明問題? – 2010-11-11 13:10:53