假设我在application-context.xml
:中有一个bean
<bean id="foo" class="biz.tugay.FooImpl" />
我有另一个模块,比方说模块thud,在application-context-thud.xml
中,我也会有:
<bean id="foo" class="biz.tugay.thud.ThudFooImpl" />
因此,当我在激活profile 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
有依赖项,我也必须将依赖项注入到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而不需要将所有依赖项注入子类化bean?
我不记得我自己在实践中使用过它,但我认为它可能是您正在寻找的parent
属性:
春季文档
Mkyong教程
使用您的术语的未经测试的示例:
<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"/>
我预计这不会完全奏效,我没有一个项目可以轻松地测试它,但希望与文档一起,它能为你带来一些帮助。。。
您可以通过组合而不是继承使ThusFooImpl
扩展FooImpl
。它们都应该实现Foo
接口,并且可以将FooImpl
的实例注入到ThudFooImpl
中。然后从ThudFooImpl
中if
语句的第二个分支调用注入的FooImpl
。