覆盖Spring中的构造函数参数

时间:2017-10-12 20:35:59

标签: java spring dependency-injection

假设我有两个bean(其中BeanA属性是不可变的,需要构造函数注入):

<bean id="beanA1" class="BeanA">
  <constructor-arg type="ServiceA" ref="serviceA" />
  <constructor-arg type="ServiceB" ref="serviceB" />
  <constructor-arg type="ServiceC" ref="serviceC" />
  <constructor-arg type="boolean" value="false" />
</bean>

<bean id="beanA2" class="BeanA">
  <constructor-arg type="ServiceA" ref="serviceA" />
  <constructor-arg type="ServiceB" ref="serviceB" />
  <constructor-arg type="ServiceC" ref="serviceC" />
  <constructor-arg type="boolean" value="true" />
</bean>

由于它们共享除布尔值之外的所有内容,我想将它们合并为:

<bean id="beanA1" class="BeanA">
  <constructor-arg type="ServiceA" ref="serviceA" />
  <constructor-arg type="ServiceB" ref="serviceB" />
  <constructor-arg type="ServiceC" ref="serviceC" />
  <constructor-arg type="boolean" value="false" />
</bean>

<bean id="beanA2" parent="beanA1">
  <constructor-arg type="boolean" value="true" />
</bean>

然而,这似乎并没有起作用

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'beanA2' defined in class path resource [context.xml]: Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities)

使用构造函数注入的任何方法吗?

2 个答案:

答案 0 :(得分:1)

您无法使用构造函数依赖注入实现您想要实现的目标,因为在beanA2的情况下,您正在调用具有单个布尔参数的构造函数。

但是,如果将注入从基于构造函数的更改为基于setter的DI,则可以实现所需的目标:

<bean id="beanA1" class="BeanA">
  <property type="ServiceA" ref="serviceA" />
  <property type="ServiceB" ref="serviceB" />
  <property type="ServiceC" ref="serviceC" />
  <property type="boolean" value="false" />
</bean>

<bean id="beanA2" parent="beanA1">
  <property type="boolean" value="true" />
</bean>

有关详细信息,请参阅Spring文档Bean definition inheritance

答案 1 :(得分:0)

当前异常,告诉您没有只有一个boolean值的构造函数。目前尚不清楚为什么需要构造函数注入,您可以尝试将所需属性设置为false