在spring bean定义之外的spring bean中设置一个属性

时间:2009-12-30 07:59:55

标签: spring

我在我的控制之外定义了一个spring bean。我想在spring bean中设置一个属性,这可能来自spring XML吗?

e.g。 a.xml(不受我控制):

<bean id="a" class="A"/>
<bean id="b" class="B">
    <constructor-arg ref="a"/>
</bean>

b.xml(由我控制)

<import resource="classpath:META-INF/a.xml"/>
<bean id="c" class="C"/>
<!-- here i want to set a property in bean a -->

一个选项,但我不喜欢它以编程方式设置属性。 我在java中使用spring 2.5。

4 个答案:

答案 0 :(得分:3)

您可以在弹簧配置中定义属性。

<bean id="myBean"class="myClass">
  <property name="myProperty">
  </property>
</bean>

拥有same name can be configured和最后一个豆的豆子会赢(也许是第一个我对此不太确定)。如果以定义加载为最后一个的方式订购配置xml文件,它将重新定义bean。

答案 1 :(得分:3)

你可以将bean-a注入另一个类并在那里设置它的属性

<bean id="foo" class="...MySetterClass" init-method="init">
    <property name="candidateBean" ref="a"/>
    <property name="candidateProperty" value="bar"/>
</bean>

所以你的类MySetterClass可以做类似

的事情
class MySetterClass {
    /*... Setter boilerplate */
    public void init(){
        candidateBean.setCandidateProperty(candidateProperty);
    }
}

这是一种非常丑陋的方法,但它应该有用。

答案 2 :(得分:0)

不知道更多:

您可以使提供的bean成为另一个bean的父级,并在第二个bean中注入属性值。然后,使用您创建的bean而不是提供的bean。

<bean id="myNewBean" parent="suppliedBean">
    <property key="prop" value="foo"/>
</bean>

如果有其他bean引用了第一个bean需要注入的属性值,或者有代码按名称查找这个bean,那么这将不起作用。同样,在某些情况下,根据您的事务和aop配置,这可能不是您想要的。但是,如果你需要做的就是在普通的旧bean上为你自己的代码注入一个属性,这应该没问题。

答案 3 :(得分:0)

导入a.xml时:

<bean id="a" class="A"/>
<bean id="b" class="B">
    <constructor-arg ref="a"/>
</bean>

对于客户端类上的init方法来说,修改bean a很难看。

我在这里并没有真正解决问题:一些框架可能会为您提供一个已经准备好,准备好运行的弹簧上下文。如果您不喜欢这个已经准备好的东西,为什么要在运行时使用花哨的策略修改它?这只是一个背景。

您可以在该上下文中重用所需的bean,如果您不喜欢bean a,只需声明自己的bean a2

当您导入的上下文的许多bean中使用bean a时,这只是一个问题。 如果是这种情况,那么您可以复制a.xml上下文并对其进行自定义。


如果您使用命名空间因为它更容易,有时您会发现在使用命名空间时某些选项是不可能的,并且您最终使用FactoryBean或手动声明bean。导入外部xml上下文时,它是相同的:有时它不会执行您想要的操作。

Spring帮助您将对象连接在一起。命名空间或外部上下文是预定义的布线。如果您不喜欢预定义的布线,只需使用自己的xml或FactoryBean自行完成。


如果要复制和自定义的连接非常大(多个xml文件等等)并且您只想对单个bean执行一些修改,那么您应该尝试一下Thomas Jung告诉您的内容:覆盖你不喜欢的bean。有用! Spring's overriding bean