Обновите значение свойства bean-компонента Spring, используя SpEL - PullRequest
0 голосов
/ 19 ноября 2010

Я создаю веб-приложение с использованием Spring 3 и хотел бы использовать возможности языка Spring Expression, но столкнулся с проблемой.Мне нужно установить значение свойства одного из моих bean-компонентов в результате вызова метода для другого bean-компонента.Я знаю, что могу это сделать, но проблема в том, что результат этого вызова метода может измениться после инициализации компонента, и мне нужно, чтобы это свойство отражало это изменение.Например:

<beans>
 ...
 <bean name="guestList" class="java.util.ArrayList"></bean>

 <bean name="party" class="some.custom.class.Party">
  <property name="numberOfGuests" value="#{guestList.size()}" />
 </bean>
 ...
</beans>

Из того, что я могу сказать, поле numberOfGuests устанавливается при первом доступе к полю party.Но после доступа к полю party число гостей может измениться, и мне нужно поле numberOfGuests, чтобы отразить это.Есть ли способ повторно инициализировать поле numberOfGuests в моем приложении всякий раз, когда мне нужно обновить значение?

Это всего лишь пример, и прямой доступ к компоненту guestList не будет работать для моей конкретной ситуации.

Ответы [ 3 ]

2 голосов
/ 19 ноября 2010

если вы установите прототип в свой прототип, то каждый раз, когда Spring загружает ваш бин, он должен пересчитывать размер списка гостей:

 <bean name="party" class="some.custom.class.Party" scope="prototype">

Таким образом, party становится прототипом, но guestList может оставаться одиночным ((это область действия по умолчанию).

Однако есть одна загвоздка: если у вас есть другой компонент, например partyHost (который является синглтоном), и ему вводится party (который является прототипом),partyHost никогда не получит другой экземпляр party, поскольку partyHost является одноэлементным, и в него вводятся зависимости только один раз.Поэтому, чтобы это работало, все ваши bean-компоненты, которым требуется обновленный размер гостевого списка, и все bean-компоненты, которые ссылаются на них и т. Д., Также должны быть прототипами.

Либо так, либо вы должны спроситьSpring напрямую через их API.Если вы используете API, вы можете вызывать его в любое время и получить новый экземпляр компонента-прототипа и, следовательно, обновленный размер списка гостей.

applicationContext.getBean("myPrototype");

Однако лучше избегать Spring API, есливы можете.Обычно разработчики не хотят быть связанными с инфраструктурой DI.

0 голосов
/ 24 ноября 2010

Я полагаю, что самое простое сделать - это внедрить список (guestList) в компонент и вызывать его метод .size() вручную из кода Java каждый раз, когда вам нужно numberOfGuests, то есть:

package some.custom.class;

public class Party {
   private List<?> guestList;
   // getter & setters

   public int getNumberOfGuests() {
     return guestList!=null ? guestList.size() : 0;
   }

}

и ...

<bean name="party" class="some.custom.class.Party">
  <property name="guestList" ref="guestList"/>
 </bean>
0 голосов
/ 19 ноября 2010

В примере # {guestlist.size ()} задается только начальное значение свойства, а не политика его актуальности. Предполагая, что вы не используете отложенную загрузку, Spring запускает управляемые bean-компоненты Spring из контекста приложения при запуске. С этого момента разработчик должен обработать обновление значений свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...