Уничтожить весь сессионный компонент класса - PullRequest
0 голосов
/ 11 ноября 2018

Есть ли способ уничтожить весь созданный сессионный компонент определенного класса (и позволить Spring воссоздать при необходимости)?

Например, 2 пользователя посещают приложение, и тогда для каждого пользователя будет по 1 бину. Я хотел бы уничтожить все эти 2 боба.

Вариант использования:

Администратор обновляет строку меню. Данные списка строк меню хранятся в сессионном компоненте. bean-компонент admin должен быть уничтожен, а строка меню должна быть обновлена. и, конечно же, следует обновлять меню других, так что остальные компоненты также должны быть уничтожены.

примечание 1: разные пользователи могут видеть разные меню, поэтому bean-компонент имеет сессионную область, а не singleton.

примечание 2: я не хочу аннулировать весь сеанс пользователя, а только этот бин

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

((ScopedObject) myBean).removeFromScope();

Большое спасибо !!

1 Ответ

0 голосов
/ 11 ноября 2018

Уничтожение бобов и их воссоздание кажется излишним и немного грязным.
Для таких подходов я бы предпочел события, а Spring предоставляет Spring Event API (spring-context зависимость).
Вы можете внедрить экземпляр ApplicationEventPublisher в класс bean-компонента, который вызывает изменение состояния для некоторых других bean-компонентов, и эти bean-компоненты могут зарегистрировать даже прослушиватель (@EventListener(condition = "...")) для чтения этого события изменения.

Например, издатель:

@Component
public class PublisherBean{

    private final ApplicationEventPublisher publisher;

    @Autowired
    public PublisherBean(ApplicationEventPublisher publisher) { ... }

    public void createOrder(Order order) {
        // ....
        this.publisher.publishEvent(new OrderCreatedEvent(order)); 
    }    
}

Подписчики / Слушатели:

@Component
public class ListenerBean{

  @EventListener(condition = "#creationEvent.awesome")
  public void handleOrderCreatedEvent(CreationEvent<Order> creationEvent) {
    ... 
  }

}

Вы можете увидеть больше информации здесь .

...