首页 > 解决方案 > 如何在不创建对它的引用的情况下实例化会话范围的 bean?

问题描述

我有一个 websocket 范围的 bean,每次创建新会话时都会做一些事情。问题是这个bean使用了一些可观察的处理程序,它没有被直接调用,所以这个bean永远不会被实例化。

如何在不直接访问它的情况下实例化 websocket 范围的 bean?

标签: javaspringspring-websocket

解决方案


我的解决方案:

创建要在要初始化的组件上使用的接口:

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();
    }

}

现在你只需要调用 WebSocketBeanInitializer 的 initialize() 方法就可以创建一个新的会话。


推荐阅读