Как создать экземпляр сессионного компонента без ссылки на него? - PullRequest
0 голосов
/ 10 мая 2019

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

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

1 Ответ

0 голосов
/ 28 июня 2019

Мое решение:

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

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 всегда, когда создается новый сеанс.

...