我的配置中有以下定义:
<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),而不必对值进行硬编码。但是,上面的代码段似乎不起作用。我应该怎么改变这个?
答案 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