如何在具有基于运行时概要文件的多个模块的Maven项目中使用Spring正确覆盖bean



假设我在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中。然后从ThudFooImplif语句的第二个分支调用注入的FooImpl

最新更新