WebSocket 範圍

每個 WebSocket 工作階段都有一個屬性 Map。此 Map 作為標頭附加到傳入的用戶端訊息,並且可以從控制器方法存取,如下列範例所示

@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() {
		// 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 生命週期方法,如前面的範例所示。