ぺんぎんらぼ

お笑いとマンガ好きなしょぼしょぼWeb系エンジニアの日記です。たまに絵を描きます。

お笑いとマンガ好きなしょぼしょぼWeb系エンジニアの日記です

よくあるDIの勘違い③ - Java EEのdependentスコープ

Java EECDIには、dependentというスコープがあります。
このdependentスコープのライフサイクルについて、勘違いしているケースをよく見ます。

どんな勘違い?

このdependentのライフサイクルについて、「Inject先のBeanのスコープに準ずる」というような記載をよく見ます。
この説明を受けて、Inject先がアプリケーションスコープならdependentのBeanもアプリケーションスコープ、Inject先がリクエストスコープならdependentのBeanもリクエストスコープと、ライフサイクルが動的に変化するもの、と勘違いすることが多いです。

勘違いの通りだとすると、Dependentスコープのインスタンスは以下の図のようになります。

実際のライフサイクルは?

dependentのBeanのライフサイクルは、Inject先のBeanのライフサイクルに準ずる、が正しいです。
この説明をしても「やっぱり勘違いしてる時の認識と同じじゃん」と思う人も多いです。別の言い方をすると、dependentのBeanはInject時にインスタンスがnewされる、とも言えます。

dependentのBeanをInjectするコードは、ほかのスコープのBeanをInjectする時と同じです。

@Inject
private DepScope depScope;

このコードは以下のように書き換えたものと同等です。

private DepScope depScope = new DepScope();

このことから、正しいDependentスコープのインスタンスは以下の図のようになります。

DependentスコープのBeanは、Injectのたびに新しいインスタンスが作成されます。つまり、newでインスタンスを作成するコードと同等といえます。