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