java - 如何根据运行时配置文件在具有多个模块的 Maven 项目中使用 Spring 正确覆盖 Bean?

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

因此,当我在激活配置文件 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属性:

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

我预计这不会完全起作用,我没有一个可以轻松测试它的项目,但希望与文档一起可以帮助您......

关于java - 如何根据运行时配置文件在具有多个模块的 Maven 项目中使用 Spring 正确覆盖 Bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34131172/

相关文章:

java - 将 TransactionProxyFactoryBean 与 Spring 和 Hibernate 一起使用

java - Spring JndiTemplate 和从上下文中参数化 JNDI 查找

Java - 从 Maven 安装 Spring

java - Maven 对 zip Artifact 的依赖

java - Junit 5 (jupiter) 使用 Maven 进行条件执行

java - 从服务器发送简单错误响应消息来调用 jQuery ajax 方法(例如,responseText)的最佳方法是什么?

java - 如何从另一个传递表单对象和调用的 Action 方法调用spring Controller @RequestMapping

java - 打开具有不同结果的相同 Activity 。来自 MainActivity

java - 类文件错误 : "Identifier expected"

java - Spring 测试失败 : java. lang.NoClassDefFoundError: org/springframework/cglib/transform/impl/MemorySafeUndeclaredThrowableStrategy