liguofeng29’s blog

個人勉強用ブログだっす。

S2Container - コンポーネントの定義とライフサイクル

1. コンポーネントの定義はcomponetタグで定義する。

 

属性名説明
class(必須) コンポーネントのクラスを指定する
name コンポーネント名を指定する
instance コンポーネントのライフサイクルを指定する。詳細は2,3を参照
autoBinding コンポーネントの自動バインディング挙動を指定する

2. インスタンス管理

instance属性説明
singleton(default) S2Container.getComponent()を何度呼び出しても同じインスタンスが返されます。
prototype S2Container.getComponent()を呼び出すたびに新たなインスタンスが返されます。
request リクエスト毎に1つのインスタンスが作成されます。 name属性に指定した名前で、コンポーネントがリクエストに格納されます。 requestを利用するためにはS2ContainerFilterの設定が必要です。
session セッション毎に1つのインスタンスが作成されます。 name属性に指定した名前で、コンポーネントがセッションに格納されます。 sessionを利用するためにはS2ContainerFilterの設定が必要です。
application Servletを使う場合は、ServletContext毎に1つのインスタンスが作成されます。 name属性に指定した名前で、コンポーネントがServletContextに格納されます。 applicationを利用するためにはS2ContainerFilterの設定が必要です。
outer コンポーネントインスタンスは、S2Container外で作成し、Dependency Injectionだけを行います。アスペクトコンストラクタ・インジェクションは適用できません。
 
3. ライフサイクル 
【S2Containerのライフサイクル】
 
a. Webアプリケーションの場合、
S2ContainerServletの初期化時にS2Container.init()が呼び出され、 
S2ContainerServletの終了時にS2Container.destroy()が呼び出されます。
 
S2Container.init()が呼び出されたときに、シングルトンのコンポーネントは初期化され、 
S2Container.destroy()が呼び出されたときに、シングルトンのコンポーネントは破棄されることになります。
 
b. Webアプリケーション以外の場合、
明示的にS2Container.init()、 S2Container.destroy()を呼び出す必要があります。

コンポーネントのライフサイクル】

シングルトンのコンポーネントはS2Container.init()時に初期化されますが、 

それ以外のコンポーネントは取得されるときに初期化が行なわれます。

4.【設定ファイル例】

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
<!-- ルート -->
<components>
    <!-- nameはコンポーネント名-->
    <component name="component1" class="org.seasar2.Compomnent1">
    </component>
    <component name="component2" class="org.seasar2.Compomnent1">
    </component>
</components>
詳細のタグリファレンスは