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 使用作用域代理模式,如下例所示:
@Component
@Scope(scopeName = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyBean {
@PostConstruct
public void init() {
// 依赖注入后调用
}
// ...
@PreDestroy
public void destroy() {
// WebSocket 会话结束时调用
}
}
@Controller
public class MyController {
private final MyBean myBean;
@Autowired
public MyController(MyBean myBean) {
this.myBean = myBean;
}
@MessageMapping("/action")
public void handle() {
// 当前 WebSocket 会话中的 this.myBean
}
}
与任何自定义作用域一样,Spring 在从控制器中首次访问 MyBean 实例时初始化一个新实例,并将该实例存储在 WebSocket 会话属性中。直到会话结束,相同的实例将被重复返回。WebSocket 作用域的 bean 会调用所有 Spring 生命周期方法,如前面的示例所示。