可以使用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