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.