目次
コンポーネントとは,S2コンテナに管理されるオブジェクトのことです.
S2コンテナで管理可能なコンポーネントは特別なクラスである必要はなく,ほとんどのJavaクラスをコンポーネントとして扱うことが可能です.
コンポーネントは<component>
要素で定義します.
<component name="componentName" (1) class="fullQualifiedClassName" (2) instance="singleton | prototype | outer | request | session | application" (3) autoBinding="auto | constructor | property | semiauto | none" (4) externalBinding="true | false" (5) > ... </component>
(1) |
|
(2) |
|
(3) |
|
(4) |
|
(5) |
|
<component>要素の内容には,次のものを記述することができます.
インスタンス生成式
<arg>
要素
<property>
要素
<initMethod>
要素
<destroyMethod>
要素
<aspect>
要素
<interType>
要素 (Seasar2.4以降)
<meta>
要素 (Seasar2.1以降)
<description>
要素
<component>
要素は,次の要素の子として記述することができます.
<components>
要素
<arg>
要素
<property>
要素
<aspect>
要素
<interType>
要素 (Seasar2.4以降)
<meta>
要素 (Seasar2.1以降)
<components>
要素以外の要素の子として定義したコンポーネントは,他のコンポーネントから参照することができません.
コンポーネントは名前を持つことができます. この名前は,コンテナからコンポーネントを取得する際のキーとして使うことができます ().
また,自動バインディグの際にはプロパティ名とのマッチングに使用されます ().
インスタンス・モードがrequest
・session
・application
の場合,コンポーネント名は必須です.
コンポーネント名は,Javaの識別子として有効な名前を指定します. JavaBeansのプロパティ名と同じルールに従うことを推奨します.
コンポーネント名は,<components>
要素の直下に定義されたコンポーネント定義の場合のみ有効です.
<property>
要素など,他の要素の子として定義された<component>
要素では,name
属性は無視されます.
コンポーネントのクラスを指定することができます.
この指定の必要性と解釈はinstance
属性の値がouter
かどうかと,インスタンス生成式の有無によって変わります.
表 14.1. instance
属性・インスタンス生成式とclass
属性の関係
instance 属性
|
インスタンス生成式 | class 属性
|
説明 |
---|---|---|---|
outer 以外
|
あり | あり | インスタンス生成式によって生成されるインスタンスがコンポーネントとなります.
このインスタンスは,class 属性で指定されたクラスに代入可能でなくてはなりません.
代入可能でない場合は,org.seasar.framework.container.ClassUnmatchRuntimeException がスローされます.
|
なし | インスタンス生成式によって生成されるインスタンスがコンポーネントとなります. | ||
なし | あり | 指定されたクラスのインスタンスがコンポーネントとなります. インスタンスの生成に使用されるコンストラクタについては,「コンストラクタ・インジェクション」を参照してください. | |
なし | エラー. インスタンス生成式またはclass属性のどちらかが必要です.
両方が省略されるとorg.seasar.framework.container.factory.TagAttributeNotDefinedRuntimeException がスローされます.
|
||
outer |
- | あり | 外部から渡されるインスタンスがコンポーネントとなります.
class 属性が指定された場合,外部から渡されるインスタンスはclass 属性で指定されたクラスに代入可能でなくてはなりません.
代入可能でない場合は,org.seasar.framework.container.ClassUnmatchRuntimeException がスローされます.
|
なし | 外部から渡されるインスタンスがコンポーネントとなります. |
インスタンス・モードとして,コンポーネントのスコープを指定することができます.
指定可能な値を次に示します.
singleton
(デフォルト)コンテナ内で唯一のインスタンスが作成されるモードです.
singleton
のインスタンスはコンテナの初期化時に作成されます.
コンテナからコンポーネントが取得されると,毎回同一のインスタンスが返されます.
prototype
コンテナからコンポーネントが取得される度に,新しいインスタンスが作成されるモードです.
outer
外部で作成されたインスタンスがコンテナに渡されるモードです.
コンテナはouter
のコンポーネントについてはインスタンスの生成も管理も行いません.
outer
は,コンテナの外部で生成されたインスタンスにDIを適用するためのモードです.
request
(Version: 2.1~)リクエスト単位にインスタンスが作成されるモードです.
request
モードでは,name
属性が必須となります.
request
モードを使用するにはコンテナに外部コンテキストが設定されている必要があります.外部コンテキストの詳細は「」を参照してください.
Webアプリケーションでは,request
のインスタンスはHttpServletRequest
の属性として保持されます.
コンポーネントが取得される際,コンテナはHttpServletRequest
からコンポーネント名をキーとして属性を取得します.
属性が存在しなければ,コンポーネントをインスタンス化してHttpServletRequest
に設定し,それをコンポーネントとして返します.
属性が存在すれば,それをコンポーネントとして返します ().
session
(Version: 2.1~)セッション単位にインスタンスが作成されるモードです.
session
モードでは,name
属性が必須となります.
session
モードを使用するにはコンテナに外部コンテキストが設定されている必要があります.外部コンテキストの詳細は「」を参照してください.
Webアプリケーションでは,session
のインスタンスはHttpSession
の属性として保持されます.
コンポーネントが取得される際,コンテナはHttpSessiont
からコンポーネント名をキーとして属性を取得します.
属性が存在しなければ,コンポーネントをインスタンス化してHttpSession
に設定し,それをコンポーネントとして返します.
属性が存在すれば,それをコンポーネントとして返します ().
application
(Version: 2.4~)アプリケーション単位にインスタンスが作成されるモードです.
application
モードでは,name
属性が必須となります.
application
モードを使用するにはコンテナに外部コンテキストが設定されている必要があります.外部コンテキストの詳細は「」を参照してください.
Webアプリケーションでは,application
のインスタンスはServletContext
の属性として保持されます.
コンポーネントが取得される際,コンテナはServletContext
からコンポーネント名をキーとして属性を取得します.
属性が存在しなければ,コンポーネントをインスタンス化してServletContext
に設定し,それをコンポーネントとして返します.
属性が存在すれば,それをコンポーネントとして返します.
自動バインディングのモードを指定することができます. 自動バインディングの詳細は「」を参照してください.
autoBinding
属性に指定可能な値を次に示します.
auto
(デフォルト)コンストラクタ・インジェクションとセッター・インジェクションの両方に自動バインディングが適用されます.
constructor
コンストラクタ・インジェクションに対してのみ,自動バインディングが適用されます.
property
セッター・インジェクションに対してのみ,自動バインディングが適用されます.
none
自動バインディングは適用されません.
semiauto
(Seasar2.4以降)アノテーション等で明示的に指定されたプロパティに対してのみ,自動バインディングが適用されます.
外部バインディングを使用するかどうかを指定することができます. 外部バインディングの詳細は「」を参照してください.
externalBinding
属性に指定可能な値を次に示します.
false
(デフォルト)外部バインディングを使用しません.
true
外部バインディングを使用します.
<component>
要素の内容に,コンポーネントのインスタンスを生成するためのOGNL式を記述することができます.
OGNL式の詳細は「」を参照してください.
OGNL式を評価した結果のオブジェクトがコンポーネントのインスタンスとなります.
<component name="hoge"> new foo.bar.Hoge() </component>
インスタンス生成式を使うことにより,シングルトン・パターンやファクトリによって取得したインスタンスや定数をコンポーネントとして扱うことができます.
<component name="hoge"> @foo.bar.HogeFactory@getInstance() </component>
インスタンス生成式は,コンポーネントが作成される際に評価されます.
<component>
要素にclass
属性が指定された場合は,インスタンス生成式を評価した結果のオブジェクトはclass
属性で指定されたクラスに代入可能でなくてはなりません.
代入可能でない場合は,org.seasar.framework.container.ClassUnmatchRuntimeException
がスローされます.