如何在不创建会话范围的Bean的情况下实例化它?

时间:2019-05-09 21:04:16

标签: java spring spring-websocket

我有一个websocket范围的bean,每次创建新会话时都会执行某些操作。问题在于该bean使用了一些可观察的处理程序,它不会直接调用,因此永远不会实例化该bean。

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

1 个答案:

答案 0 :(得分:0)

我的解决方案:

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

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()方法即可。