此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
WebSocket 作用域
每个 WebSocket 会话都有一个属性映射。该映射作为标头附加到入站客户端消息,并且可以从控制器方法访问,如以下示例所示:
@Controller
public class MyController {
@MessageMapping("/action")
public void handle(SimpMessageHeaderAccessor headerAccessor) {
Map<String, Object> attrs = headerAccessor.getSessionAttributes();
// ...
}
}
您可以在websocket
范围。 您可以将 WebSocket 范围的 bean 注入到控制器和任何通道拦截器中注册在clientInboundChannel
. 这些通常是单例和实时比任何单个 WebSocket 会话都长。因此,您需要使用scope 代理模式用于 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 生命周期方法,如如前面的示例所示。