跳到主要内容

WebSocket 范围

ChatGPT-4o-mini 中英对照 WebSocket Scope

每个 WebSocket 会话都有一个属性映射。该映射作为头部附加到传入的客户端消息,并可以从控制器方法中访问,如下例所示:

@Controller
public class MyController {

@MessageMapping("/action")
public void handle(SimpMessageHeaderAccessor headerAccessor) {
Map<String, Object> attrs = headerAccessor.getSessionAttributes();
// ...
}
}
java

您可以在 websocket 范围内声明一个 Spring 管理的 bean。您可以将 WebSocket 范围的 bean 注入到控制器和注册在 clientInboundChannel 上的任何通道拦截器中。这些通常是单例,并且比任何单个 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
}
}
java

与任何自定义作用域一样,Spring 在第一次从控制器访问时初始化一个新的 MyBean 实例,并将该实例存储在 WebSocket 会话属性中。此后,直到会话结束,都会返回相同的实例。WebSocket 作用域的 bean 会调用所有 Spring 生命周期方法,如前面的示例所示。