假设在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的一个属性".message",忽略所有其他细节。
我正在考虑使用类似的东西:
<bean id="myproxy" class="com.myapp.Proxy" init-method="copyProperties">
<property name="proxied" value="the.message" />
<property name="message" value="my message" />
</bean>
此"代理"仅用于设置".message"的属性。
要做您想做的事情,SomeClass
需要有一个setter。您只需要像往常一样注入bean,然后使用setter。使用注释会更容易,但使用XML也是可行的。
但是,请确保您意识到这样做会在全局范围内更改bean的值。如果任何东西都依赖于原始值,那么它将不复存在。
我相信这可以在导入上下文文件中使用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>