WebSocket 作用域
每個 WebSocket 會話都有一個屬性 map。該 map 作為 header 附加到入站客戶端訊息,並且可以從控制器方法中訪問,示例如下
@Controller
public class MyController {
@MessageMapping("/action")
public void handle(SimpMessageHeaderAccessor headerAccessor) {
Map<String, Object> attrs = headerAccessor.getSessionAttributes();
// ...
}
}
您可以在 websocket 作用域中宣告一個 Spring 管理的 bean。您可以將 WebSocket 作用域的 bean 注入到控制器以及 clientInboundChannel 上註冊的任何 channel interceptor 中。這些通常是單例,並且比任何單個 WebSocket 會話的生命週期更長。因此,您需要為 WebSocket 作用域的 bean 使用作用域代理模式,示例如下
@Component
@Scope(scopeName = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyBean {
@PostConstruct
public void init() {
// Invoked after dependencies injected
}
// ...
@PreDestroy
public void destroy() {
// Invoked when the WebSocket session ends
}
}
@Controller
public class MyController {
private final MyBean myBean;
@Autowired
public MyController(MyBean myBean) {
this.myBean = myBean;
}
@MessageMapping("/action")
public void handle() {
// this.myBean from the current WebSocket session
}
}
與任何自定義作用域一樣,Spring 會在首次從控制器訪問時初始化一個新的 MyBean 例項,並將其儲存在 WebSocket 會話屬性中。同一例項隨後會被返回,直到會話結束。WebSocket 作用域的 bean 會呼叫所有 Spring 生命週期方法,如前面的示例所示。