此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

WebSocket 作用域

每个 WebSocket 会话都有一个属性映射。该地图作为标头附加到 inbound 客户端消息,可以从控制器方法访问,如以下示例所示:spring-doc.cadn.net.cn

@Controller
public class MyController {

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

您可以在websocket范围。 您可以将 WebSocket 范围的 Bean 注入到控制器和任何通道拦截器中 在clientInboundChannel.这些通常是单例和活的 比任何单个 WebSocket 会话都长。因此,您需要使用 代理模式下的 WebSocket 范围的 bean,使用@WebSocketScope:spring-doc.cadn.net.cn

@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 中的时间 session 属性。随后返回同一实例,直到会话 结束。WebSocket 范围的 bean 调用了所有 Spring 生命周期方法,如 如前面的示例所示。spring-doc.cadn.net.cn