Java EEのCDIには、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でインスタンスを作成するコードと同等といえます。