3
4

More than 3 years have passed since last update.

【Java】Spring DI ④ - ライフサイクル管理

Posted at

DIのライフサイクル管理とは

  • DIでは、インスタンスのスコープを設定できる
  • スコープは、@Scopeアノテーションで設定
  • デフォルトではsingletonになり、インスタンスが1つしか作られない
  • スコープが異なるインスタンスをフィールドに持つ場合注意

ライフサイクル管理て何?

  • インスタンスの生成(new)と破棄を管理
  • newして生成したインスタンスを破棄するには、変数にnullを入れメモリを解放
  • しかし!@Autowiredを付けたフィールドではnullしなくてもSpringが自動でやってくれるのです!
  • しかもサーブレットを使う時にインスタンスのスコープ登録もSpringがやってくれます!
(サーブレットはインスタンスをSessionスコープやRequestスコープに登録する機能)
  • 注:インスタンスがいつ破棄されるのかをちゃんと把握しておくこと

スコープとは

  • インスタンスの有効期限
    • 例:Javaのローカル変数でif文の中で宣言した変数は、if文の中がスコープなので、if文の外では使えない
  • Sessionスコープ
    • ユーザーがログインしてからログアウトするまでが有効期限
  • Requestスコープ
    • HTTPの1リクエストが有効期限
    • 例:ユーザー登録画面から登録結果画面までがRequestスコープの範囲

Scopeの使い方

  • 以下のように@Scopeアノテーションで、そのアノテーションにどのスコープに登録するか指定
  • @Component以外にも、@Bean@Controllerなどにも@Scopeアノテーションは利用可能
  • 簡単にインスタンスの生成と廃棄ができる
@Component
@Scope("prototype")
public class SampleComponent{

}

@Scopeで指定するScope

  • singleton
    • デフォルト設定
    • Spring起動時にインスタンスを1つだけ生成,
    • 生成後1つのインスタンスを共有して使う
  • prototype
    • Beanを取得する度に、毎回インスタンスが生成
  • session
    • HTTPのセッション単位でインスタンスが生成。Webアプリケーションの場合のみ使用
  • request
    • HTTPのリクエスト単位でインスタンスが生成。Webアプリケーションの場合のみ使用
  • globalSession
    • ポートレット環境におけるGrobalSession単位でインスタンスが生成
    • ポートレットに対応したWebアプリケーションの場合のみ使用
  • application
    • サーブレットのコンテキスト単位でインスタンスが生成。Webアプリケーションの場合のみ使用できます。

注意1:デフォルトはsingleton

  • @Scopeを付けないと、インスタンスがsingletonで作成
  • singletonだと、オブジェクトのインスタンスは1つしか作られず2個目以上のインスタンスを作ることすらできない
  • @Controller@Service@Repositoryのスコープは通常singletonで十分

注意2:スコープが異なるインスタンスをフィールドに持つ場合

  • singletonスコープのインスタンスが、prototypeスコープのオブジェクトを持っている場合、prototypeスコープを設定したBean(以下PrototypeComponent)が、singletonスコープになってしまう
//singletonスコープになってしまう
@Component
@Scope("prototype")
public class PrototypeComponent{

}
@Component
public class SingletonComponent{    
    @Autowired
    private PrototypeComponent component;
}
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4