WebSocket 作用域
每个 WebSocket 会话都有一个属性映射。该映射作为报头附加到传入的客户端消息,并可以从控制器方法中访问,如下例所示:
@Controller
public class MyController {
@MessageMapping("/action")
public void handle(SimpMessageHeaderAccessor headerAccessor) {
Map<String, Object> attrs = headerAccessor.getSessionAttributes();
// ...
}
}
你可以在websocket作用域中声明一个Spring管理的bean。
你可以将WebSocket作用域的bean注入到控制器和注册在clientInboundChannel上的任何通道拦截器中。
这些通常是单例的,并且比任何单个WebSocket会话存活时间更长。因此,你需要以代理模式使用WebSocket作用域的bean,
这可以通过便利地使用@WebSocketScope定义:
@Component
@WebSocketScope
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 生命周期方法,如前面的示例所示。