Spring - 如何在同一个bean中引用另一个属性?

时间:2017-02-24 04:18:18

标签: spring properties-file

我的配置中有以下定义:

<bean class="com.project.TimerBean">
    <property name="delay" value="30000" />
    <property name="interval" value="60000" />
    <property name="invokeThis" value="com.project.TargetClass" />
    <property name="receiver" value="XYZ" />
    <property name="args" value="#{interval}" />
</bean>

我想将args的值设置为与interval相同的值(在本例中为60000),而不必对值进行硬编码。但是,上面的代码段似乎不起作用。我应该怎么改变这个?

2 个答案:

答案 0 :(得分:0)

将间隔值“60000”移动到属性文件

yourVariableName = 60000

并改为:

<property name="interval" value="${yourVariableName}" />
<property name="args" value="${yourVariableName}" />

答案 1 :(得分:0)

#syntax(Spel Expressions)应该按照你编写它的方式工作。你需要替换

MediaStore

例如,如果您创建的bean的id是timerBean,那么#{timerBean.interval}应该可以工作。即使属性是bean定义的一部分,也不能直接引用属性。

仅当您引用的属性是另一个bean的一部分时才有效。

#{interval} to #{beanId.interval}

在上面的例子中,prop2正确地从prop1初始化。但prop3初始化为null。

如果你看一下AbstractAutowireCapableBeanFactory类和方法,

<bean id="beanA" class="org.BeanA">
  <property name="prop1" value="1000" />
</bean>

<bean id="beanB" class="org.BeanB">
  <property name="prop2" value = "#{beanA.prop1}" />
  <property name="prop3" value = "#{beanB.prop2}" />
</bean>

您可以看到单个bean定义中的所有属性值都被循环并且值被解析。在成功解析所有值之后,只有它们在bean实例上设置。在上面的beanA和beanB示例中,当解析prop3的值时,spring在beanB上查找prop2的值,该值尚未设置,因此返回null。

AFAIK,除了@Alex

建议的方式外,没办法解决这个问题

PS:我使用的是Spring版本4.1.6.RELEASE