Весна - как ссылаться на другое свойство в том же бобе?

У меня есть следующее определение в моей конфигурации:

<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}" />
Другие вопросы по тегам