SpringBootでscopeを変更する。

規則

  • デフォルトはシングルトン
  • コントローラに付与されたスコープと同じスコープでない場合は例外が発生する
  • コントローラが依存するSpring Beanが別のスコープである場合は、Proxyを挟む必要がある。

スコープを変更する場合

プロトタイプ

//シングルトンスコープのコントローラ
@Controller
@RequiredArgsConstructor
public class sample{

    private final Prototype1Service prototype1Service;

    private final Prototype2Service prototype2Service;

省略

}

//プロトタイプのサービス (プロキシをNOにすることで情報を保持し、フィールドに宣言する度またはSpring BeanをApplicationContextから取得するたび異なるインスタンスを取得できる)
@Service
@Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.NO)
public class Prototype1Service {

省略
}


//プロトタイプのサービス (プロキシモードをTARGET_CLASSにする、NOとの違いはメソッドの呼び出し毎にインスタンスが新しく作られること。情報を保持しておくことができない。)
@Service
@Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Prototype1Service {

省略
}

//リクエストのサービス (リクエストセッション単位でインスタンスが作成される。プロキシモードnoの検証はできていないが要件には合致するためリクエストスコープの場合は以下を使用する。)
@Service
@Scope(scopeName = org.springframework.web.context.WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Prototype1Service {

省略
}

参考

https://kohei.life/spring-scope/

kusamakura.hatenablog.com