Весна - как ссылаться на другое свойство в том же бобе?
У меня есть следующее определение в моей конфигурации:
<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 ответа
Синтаксис # (Spel Expressions) должен работать так, как вы его написали. Вам нужно заменить
#{interval} to #{beanId.interval}
,
Например, если идентификатором создаваемого вами компонента является timerBean, #{timerBean.interval} должен работать. Вы не можете обращаться к свойству напрямую, даже если оно является частью определения компонента.
Это работает, только если свойство, на которое вы ссылаетесь, является частью другого компонента.
<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>
В приведенном выше примере prop2 правильно инициализируется из prop1. Но prop3 инициализируется нулем.
Если вы посмотрите на класс и метод AbstractAutowireCapableBeanFactory,
protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs)
вы можете видеть, что все значения свойств в одном определении бина зацикливаются и значения анализируются. После того, как все значения были успешно проанализированы, только тогда они устанавливаются в экземпляре компонента. В приведенном выше примере beanA и beanB, когда значение prop3 анализируется, spring ищет значение prop2 для beanB, которое еще не установлено, и, следовательно, возвращает ноль.
AFAIK, нет никакого способа обойти это, кроме способа, предложенного @Alex
PS: я использую весеннюю версию 4.1.6.
Переместить значение интервала "60000" в файл свойств
yourVariableName = 60000
и изменить на:
<property name="interval" value="${yourVariableName}" />
<property name="args" value="${yourVariableName}" />