Web scope


ネットワークスキャン
スプリングはWeb環境でのみ動作し、プロトタイプとは異なりミラーの終了点まで管理されるため、終了方法が呼び出される.
  • request:1つのHTTPリクエストがエントリおよび終了したときに保持される状態で、各HTTPリクエストは個別の空のインスタンスを作成および管理します.
  • session:HTTP sessionと同じライフサイクルを持つスコップ
  • アプリケーション:ServiceletContextと同じライフサイクルを持つScope
  • Websocket:Webソケットと同じライフサイクルを持つスキャン
  • Web環境の追加
    Webscopeは、Web環境によって駆動されます.Web環境にライブラリを追加します.
  • build.依存を勾配に追加
    このライブラリを追加すると、スプリングガイドは内蔵のTomcatサーバを使用してWebサーバとともに実行されます.
  • implementation 'org.springframework.boot:spring-boot-starter-web'
  • ポート番号競合
    main/resources/application.次の設定をpropertiesに追加します.
  • server.port=12345
    リクエストスキャン
    複数のHTTPリクエストを同時に受信した場合、どのリクエストが残したログを正確に区別するのが難しい場合、request scopeを使用するのが望ましい.
    request scopeを使用してログの例を残す
  • ログ形式:[UUID]「要求URL」{message}
  • Unique UUIDを使用すると、HTTPリクエストを区別できます.また、リクエストのURL情報を追加して、リクエストがどのURLから来たかを判断することもできます.
  • クラスが作成され、@Scope("request")として指定されている場合、この空は各HTTPリクエストに1つ生成され、HTTPリクエストが完了すると消去されます.
  •    @Component
       @Scope(value = "request")
       public class Logger {...}
  • @PostConstructを使用して、空の生成時にUUIDを作成して保存します.
  •    @PostConstruct
       public void init() {
           uuid = UUID.randomUUID().toString();
       }
  • webscopeの空の場合、破棄メソッドも呼び出されるため、@Predestoryを使用して終了メッセージを保持します.
  •    @PreDestory
       public void close() {
           System.out.println("close");
       }
  • requesturlはsetterメソッドを作成し、外部から入力できるようにします.
  •    public void setRequestURL(String requestURL) {
               this.requestURL = requestURL;
       }
  • Loggerは正常に動作しています.
  •    @Controller
       @RequiredArgsConstructor
       public class LogController{...}
  • HttpServletRequestrequest URLを受信し、その値をLoggerに渡す.
  • requestURL : http://localhost:8080/log-demo
  •    @RequestMapping("log-demo")
       @ResponseBody
       public String logDemo(HttpServletRequest request) {
          String requestURL = request.getRequestURL().toString();
          Logger.setRequestURL(requestURL);
          ...
       }
    リファレンス
    requestURLがLoggerに格納されている部分は、コントローラよりも汎用的な処理ができるSpring IntercepterやBrite Filterのようなところが望ましい!(例なので…)
  • ビジネスロジックを持つサービス層の作成
  •    @Service
       @RequiredArgsConstructor
       public class LogService {...}

  • request scopeではなく、これらすべての情報をパラメータでサービス層に渡すと、パラメータが多すぎて乱雑になり、requestURLのようにWebに関連する情報がWebに関係のないサービス層に移行します.Webに関連する部分ではコントローラしか使用できません.
    保守の観点から、Webテクノロジーに依存することなく、サービス層は純粋に維持されなければならない.
  • request scopeのLoggerでは、これらの部分をLoggerのメンバー変数に格納し、コードと階層をきれいに保つことができます.

  • まだエラーが発生しています!
    すなわちSpringコンテナにrequest scope beanを要求し依存関係を注入しようとするが,HTTPリクエスト自体が来ないためrequest scopeの空は生成されない.(実際の顧客要求が来た場合にのみ空になります.)
    スプリングコンテナに空の要求をする手順を、実際の顧客要求に遅らせる必要があります.