我有一个websocket范围的bean,每次创建新会话时都会执行某些操作。问题在于该bean使用了一些可观察的处理程序,它不会直接调用,因此永远不会实例化该bean。
如何在不直接访问的情况下实例化websocket范围的bean?
答案 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()方法即可。