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 に対してスコーププロキシモードを使用する必要があります。

@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 ライフサイクルメソッドがすべて呼び出されます。