在 Spring 中重写构造函数参数



假设我有两个 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)

有什么方法可以通过构造函数注入来做到这一点吗?

您无法执行尝试使用构造函数依赖项注入实现的目标,因为在beanA2的情况下,您正在使用单个布尔参数调用构造函数。

但是,如果将注入从基于构造函数的 DI 更改为基于资源库的 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 定义继承

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

最新更新