我在我的控制之外定义了一个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。
答案 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