【问题标题】:Spring - Set properties on beans imported from a different context fileSpring - 设置从不同上下文文件导入的 bean 的属性
【发布时间】:2014-10-23 08:51:48
【问题描述】:

假设在你的 spring 上下文文件中你已经导入了一些你不能修改的上下文文件。

有没有办法设置导入的 bean 的属性? 我不想从导入的上下文文件中复制和粘贴 bean 定义并对其进行修改,因为这会在我的代码和外部库之间创建错误的依赖关系。

我只需要修改现有 bean 的一个属性。

理论上应该是可能的,因为我可以使用一个自定义类来接收 bean 以更新为依赖项并在 init 方法中修改其属性。

我想知道 Spring 中是否有标准语法可以做到这一点。

例如在 library-context.xml 中有以下 bean 定义:

<bean id="the.message" class="com.someco.SomeClass">
  <property name="message" value="default message" />
</bean>

我将其作为外部依赖项导入,因此我无法修改此定义。

当然,我可以将这个定义复制并粘贴到我的上下文中并覆盖它。这对于像示例中非常简单的 bean 这样的 bean 来说是可以的。 问题是依赖关系通常要复杂得多,并且它们可以在不同版本的库中发生变化。

我想要的是设置 bean“the.message”的属性,忽略所有其他细节。

我正在考虑使用类似的东西:

<bean id="myproxy" class="com.myapp.Proxy" init-method="copyProperties">
    <property name="proxied" value="the.message" />
    <property name="message" value="my message" />
</bean>

这个“代理”只用于设置“the.message”的属性。

【问题讨论】:

标签: java spring


【解决方案1】:

要做你想做的事,SomeClass 需要有一个二传手。您只需像往常一样注入 bean 并使用该设置器。使用注解会更容易,但也可以使用 XML。

但是,请确保您意识到这样做会全局更改 bean 的值。如果有任何东西依赖于原始值,那将不再存在。

【讨论】:

    【解决方案2】:

    我相信这可以在您的导入上下文文件中使用org.springframework.beans.factory.config.MethodInvokingFactoryBean 来完成。

    使用您示例中的导入定义:

    <bean id="the.message" class="com.someco.SomeClass">
    

    消息可以像这样在导入上下文文件中设置:

    <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetObject" ref="the.message" />
        <property name="targetMethod" value="setMessage" />
        <property name="arguments">
            <list>
                <value type="java.lang.String">This message was set in importing context file</value>
            </list>
        </property>
    </bean>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 2011-03-01
      相关资源
      最近更新 更多