假设我在 application-context.xml
中有一个 bean:
<bean id="foo" class="biz.tugay.FooImpl" />
我还有另一个模块,比如说模块thud,在application-context-thud.xml
中我还将有:
<bean id="foo" class="biz.tugay.thud.ThudFooImpl" />
因此,当我在激活配置文件 thud 的情况下运行应用程序时,bean foo 将被 biz.tugay.thud.FooImpl
覆盖。到目前为止一切正常。
但是可以说我想要的就是这样的:
package biz.tugay
class FooImpl{
void foo(){// Lots of code here};
}
在重写的 bean 中我想做的是:
package biz.tugay.thud
class ThudFooImpl{
void foo(){
if(something..) return;
else {
// Lots of code here
}
};
}
所以我目前所做的是:
package biz.tugay.thud
import biz.tugay.FooImpl
class ThudFooImpl extends FooImpl{
void foo(){
if(something..) return;
else {
super.foo();
}
};
}
但问题是,如果 FooImpl
有依赖项,我也必须将依赖项注入(inject)到 ThudFooImpl
中。但正如您从代码中看到的,我什至不需要 ThudFooImpl
中的那些依赖项。我所拥有的只是一个简单的 if 检查。
因此 xml 文件中的代码将如下所示:
<bean id="foo" class="biz.tugay.Foo">
<constructor-arg ref="waldo"/>
<property name="baz" ref="baz"/>
<property name="qux" ref="qux"/>
<property name="quux" ref="quux"/>
<property name="corge" ref="corge"/>
</bean>
<bean id="foo" class="biz.tugay.thud.ThudFooImpl">
<constructor-arg ref="waldo"/>
<property name="baz" ref="baz"/>
<property name="qux" ref="qux"/>
<property name="quux" ref="quux"/>
<property name="corge" ref="corge"/>
</bean>
看起来我在这里做错了什么?
是否有任何方法可以覆盖 Bean,而不需要将所有依赖项注入(inject)子类化 Bean?
最佳答案
我不能说我记得自己在实践中使用过它,但我认为它可能是您正在寻找的parent
属性:
使用您的术语的未经测试的示例:
<bean id="foo" class="biz.tugay.Foo">
<constructor-arg ref="waldo"/>
<property name="baz" ref="baz"/>
<property name="qux" ref="qux"/>
<property name="quux" ref="quux"/>
<property name="corge" ref="corge"/>
</bean>
<bean id="thudFoo" class="biz.tugay.thud.ThudFooImpl" parent="foo"/>
我预计这不会完全起作用,我没有一个可以轻松测试它的项目,但希望与文档一起可以帮助您......
关于java - 如何根据运行时配置文件在具有多个模块的 Maven 项目中使用 Spring 正确覆盖 Bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34131172/