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
	}
}

与任何自定义作用域一样,当首次从控制器访问 MyBean 实例时,Spring 会初始化一个新的实例,并将其存储在 WebSocket 会话属性中。此后,直到会话结束,都会返回相同的实例。WebSocket 作用域的 bean 会调用所有 Spring 生命周期方法,如前面的示例所示。

© . This site is unofficial and not affiliated with VMware.