对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

WebSocket 作用域

每个 WebSocket 会话都包含一个属性映射(map)。该映射作为头部信息附加到从客户端传入的消息上,并可在控制器方法中访问,如下例所示:spring-doc.cadn.net.cn

@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 使用作用域代理模式,如下例所示:spring-doc.cadn.net.cn

@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 生命周期方法,如前面示例所示。spring-doc.cadn.net.cn