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;
}