Как создать экземпляр bean-компонента с областью действия сеанса, не создавая на него ссылку?

У меня есть bean-компонент с областью действия веб-сокета, который что-то делает каждый раз, когда создается новый сеанс. Проблема в том, что этот компонент использует некоторые наблюдаемые обработчики, он не вызывается напрямую, поэтому экземпляр никогда не создается.

Как создать экземпляр bean-компонента с областью действия веб-сокета без прямого доступа к нему?


person Hugo Sartori    schedule 09.05.2019    source источник
comment
Обновите дизайн, так как он пахнет за много миль. Если он не создан, он вообще не имеет области видимости, поэтому он также может быть одноэлементным.   -  person Antoniossss    schedule 10.05.2019
comment
Компонент использует информацию о сеансе для фильтрации данных для конкретных пользователей и отправки им отфильтрованных данных.   -  person Hugo Sartori    schedule 10.05.2019
comment
А в чем проблема? Вы можете использовать компонент сеанса в компоненте с областью действия приложения.   -  person Antoniossss    schedule 10.05.2019


Ответы (1)


Мое решение:

Создайте интерфейс для использования с компонентами, которые вы хотите инициализировать:

public interface WebSocketSessionPrematureInitialization {
    default void initialize() {}
}

Создайте компонент для инициализации всех компонентов, реализующих интерфейс:

@Component
@Scope(scopeName = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class WebSocketBeanInitializer {

    private final List<? extends WebSocketSessionPrematureInitialization> wsInit;

    @Autowired
    public WebSocketBeanInitializer(List<? extends WebSocketSessionPrematureInitialization> wsInit) {
        this.wsInit = wsInit;
    }

    public void initialize() {
        for (WebSocketSessionPrematureInitialization bean : wsInit)
            bean.initialize();
    }

}

Теперь вам просто нужно вызывать метод initialize () WebSocketBeanInitializer всегда, когда создается новый сеанс.

person Hugo Sartori    schedule 28.06.2019