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