Spring XML Bean定义覆盖问题:扩展项目中修改父项目Bean的List属性配置
问题1:是否可以覆盖该Bean的定义,为propertiesList属性追加新值?
可以,常见实现方案有两种:
- 重写同id Bean定义:Spring默认支持后加载的同id Bean覆盖先加载的定义(Spring Boot 2.1及以上版本需要显式在配置中添加
spring.main.allow-bean-definition-overriding=true开启覆盖能力)。你只需在Ext项目的XML配置中重新声明id为bean的同类型Bean,配置propertiesList属性时保留原有三个值,再追加你需要的新值即可。 - 无侵入修改方案:自定义
BeanPostProcessor实现类,在BeanClass实例初始化完成后,通过getPropertiesList()拿到原有列表,直接调用add方法追加新值,不需要修改原有Bean定义,对Root项目的逻辑无侵入。
问题2:是否可以将列表中的com.company.root.ValueA替换为com.company.ext.ExtValueA?
可以,同样有两种可选方案:
- 重写同id Bean定义:在Ext项目的XML配置中重新声明id为
bean的同类型Bean,配置propertiesList属性时直接把com.company.root.ValueA替换为com.company.ext.ExtValueA,保留其余两个原有值即可,Spring加载时会优先使用Ext项目中的Bean定义。 - 无侵入修改方案:通过自定义
BeanPostProcessor,在BeanClass实例初始化完成后遍历propertiesList,匹配到值为com.company.root.ValueA的元素后直接替换为目标值即可,不需要重写整个Bean配置,也不用改动Root项目的任何代码。
内容的提问来源于stack exchange,提问作者Igor Chestnov
相关产品推荐
相关产品推荐

