如何使用基于运行时配置文件的多个模块在Maven项目中使用Spring正确覆盖bean?

时间:2015-12-07 10:19:31

标签: java spring maven

所以,让我们说application-context.xml中有一个bean:

<bean id="foo" class="biz.tugay.FooImpl" />

我还有另一个模块,让我们说模块 thud ,在application-context-thud.xml我也会有:

<bean id="foo" class="biz.tugay.thud.ThudFooImpl" />

因此,当我运行我的应用程序并激活配置文件时,将使用biz.tugay.thud.FooImpl覆盖bean foo。到目前为止一切都还可以。

但是让我说我​​想要的就是这样:

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中的那些依赖项。如果检查,我只需要一个简单的。

因此代码在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?

2 个答案:

答案 0 :(得分:0)

我不能说我记得在练习中自己使用它,但我认为它可能是您正在寻找的parent属性:

Spring docs
Mkyong tutorial

使用您的条款的未经测试的示例:

<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"/>

我希望这不会完全正常工作,我没有一个项目可以轻松地测试它,但希望与文档一起,它将为您提供一些方法......

答案 1 :(得分:0)

您可以通过合成而不是继承来ThusFooImpl扩展FooImpl。 它们都应该实现Foo接口,并且可以将FooImpl的实例注入ThudFooImpl。然后从FooImplif语句的第二个分支调用注入的ThudFooImpl