WebSocket スコープ

各 WebSocket セッションには、属性のマップがあります。次の例に示すように、マップは受信クライアントメッセージのヘッダーとして添付され、コントローラーメソッドからアクセスできます。

@Controller
public class MyController {

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

Spring 管理の Bean を websocket スコープで宣言できます。WebSocket スコープの Bean を、clientInboundChannel に登録されたコントローラーとチャネルインターセプターに注入できます。これらの Bean は通常シングルトンであり、個々の 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
	}
}

他のカスタムスコープと同様に、Spring は、コントローラーから最初にアクセスしたときに新しい MyBean インスタンスを初期化し、WebSocket セッション属性にインスタンスを保存します。その後、セッションが終了するまで同じインスタンスが返されます。前の例に示すように、WebSocket スコープの Bean では、Spring ライフサイクルメソッドがすべて呼び出されます。