Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Springbean定义之外的Springbean中设置属性_Spring - Fatal编程技术网

在Springbean定义之外的Springbean中设置属性

在Springbean定义之外的Springbean中设置属性,spring,Spring,我有一个定义在我控制范围之外的Springbean。我想在Springbean中设置一个属性,这可以从SpringXML中实现吗 e、 g。 a、 xml(不受我控制): b、 xml(由我控制) 一个选择,但我不喜欢它是设置属性编程。 我在java中使用Spring2.5。您可以在spring配置中定义属性 <bean id="myBean"class="myClass"> <property name="myProperty"> </proper

我有一个定义在我控制范围之外的Springbean。我想在Springbean中设置一个属性,这可以从SpringXML中实现吗

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


b、 xml(由我控制)


一个选择,但我不喜欢它是设置属性编程。
我在java中使用Spring2.5。

您可以在spring配置中定义属性

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


豆子和最后一粒豆子会赢(也许是第一粒我不太确定)。如果以将定义作为最后一个加载的方式对配置xml文件进行排序,它将重新定义bean。

您可以将
bean-a
注入另一个类,并在其中设置它的属性

<bean id="foo" class="...MySetterClass" init-method="init">
    <property name="candidateBean" ref="a"/>
    <property name="candidateProperty" value="bar"/>
</bean>
这是一个相当丑陋的方法,但它应该有效。

不知道更多:

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

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


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

导入a.xml时:

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

这对于客户机类上的init方法修改bean
a
来说是很难看的

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

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

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


如果您使用名称空间是因为它更简单,那么有时您会发现在使用名称空间时某些选项是不可能的,最后您会使用FactoryBean或手动声明bean。导入外部xml上下文时,情况是一样的:有时它不做您想要的事情

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


如果复制和定制的连接相当大(多个xml文件等),并且您只想对单个bean执行一些修改,那么您应该尝试一下Thomas Jung告诉您的方法:覆盖您不喜欢的bean。它起作用了!

也许这是可能的,但是该bean被注入同一spring文件中的其他bean中,这些引用将指向“错误”的bean。然后尝试在xml顶部定义它。尝试在导入之前(或之后)在b.xml中重新定义
。正如您所描述的,我遇到了其他bean将使用其他实例的问题……这就是我所说的以编程方式执行的意思。我同意这很难看:-)它应该有效,但有更好的解决方案!不要这样做这有点晚了,代码已经在生产中了,因为已经有几年了:-)为了响应您编写的内容,我需要修改那个实例,而不是一个新实例。此外,复制所有XML对更新不是很友好(因为第三方依赖可能在某个时候需要更新),也不是覆盖bean的解决方案。我仍然认为没有完美的解决方案,但感谢您尝试改进答案。那么最好的解决方案可能是打开第三方库的票证,告诉他们提供一个工厂bean,其中包括一个可插入的策略来定制bean创建,就像它是在Spring内部完成的一样,或者您可以使用一个BeanPostProcessor,在创建之后只修改类型a(或具有“a”名称)的bean。但不应该是上下文的客户端修改上下文本身:)我知道我迟到了,只是想给出我的意见,以防有人阅读。BeanPostProcessor可能是一个可行的解决方案,我会在类似的问题中考虑。是的,我同意第三方的设计是错误的。事实上,它不是正在编辑的上下文,而是在上下文中加载的类的默认行为。
class MySetterClass {
    /*... Setter boilerplate */
    public void init(){
        candidateBean.setCandidateProperty(candidateProperty);
    }
}
<bean id="myNewBean" parent="suppliedBean">
    <property key="prop" value="foo"/>
</bean>
<bean id="a" class="A"/>
<bean id="b" class="B">
    <constructor-arg ref="a"/>
</bean>