DI定義
-依存性の注入-
はじめに
本章では,DI (Dipendency Injection,依存性の注入)
の利用方法について説明します.Seasar2が提供するDIの詳細は「」を参照してください.
<arg>要素
-コンストラクタ・インジェクション-
<arg>要素の用途
<arg>要素はコンストラクタ・インジェクションだけではなく,メソッド・インジェクションでも使われます.
<components>要素の直下の<arg>要素はコンストラクタ・インジェクション,
<initMethod>または<destroyMethos>直下の<arg>要素はメソッド・インジェクションとなります.
コンストラクタ・インジェクションは,<component>要素の子として<arg>要素を記述することによって指定します.
<arg>要素は,呼び出したいコンストラクタの引数の数だけ記述します.
<component class="fullQualifiedClassName">
<arg>content</arg>
<arg>content</arg>
...
</component>
<arg>要素の内容には次のものを記述することができます.
OGNL式または<component>要素
<meta>要素 (Seasar2.1以降)
<description>要素
コンストラクタを呼び出せない場合
コンストラクタ呼び出しでコンポーネントを直接インスタンス化できない場合は,<arg>要素を指定せず「インスタンス生成式」を指定してください.
<arg>要素の内容がコンストラクタの引数として渡されます.
<arg>要素を複数記述した場合は,その内容が記述した順番にコンストラクタ引数に渡されます.
<arg>要素の数とその内容 (型)
を適用できるコンストラクタが存在しない場合は,org.seasar.framework.beans.ConstructorNotFoundRuntimeExceptionがスローされます.
<component>要素にインスタンス生成式 (OGNL式)
を記述した場合は,<arg>要素が記述されていても無視されます.
<arg>要素の内容にOGNL式と<component>要素の両方を記述した場合,<component>要素は無視されます.
<property>要素
-セッター・インジェクション-
<component class="fullQualifiedClassName">
<property
name="propertyName"
bindingType="must | should | may | none"
>
content
</property>
</component>
name (必須): プロパティの名前を指定します.
bindingType (任意):
バインディング・タイプを指定します.デフォルトはshouldです.
JavaBeansのプロパティ名
JavaBeansの仕様では,プロパティ名の最初の文字は小文字となります.
ただし,二文字目が大文字の場合は先頭も大文字となります.
正: fooBar, z,
URL
誤: FooBar, Z,
url, uRL
<property>要素の内容には次のものを記述することができます.
OGNL式または<component>要素
<meta>要素 (Seasar2.1以降)
<description>要素
<property>要素の内容にOGNL式と<component>要素の両方を記述した場合,<component>要素は無視されます.
(Version: 2.3.0~)
bindingType属性
-バインディング・タイプ-
must
should (デフォルト)
may
none
<initMethod>要素
-initメソッド・インジェクション-
<component class="fullQualifiedClassName">
<initMethod
name="methodName"
>
<arg>content</arg>
<arg>content</arg>
...
</initMethod>
</component>
name属性 (任意): メソッドの名前を指定します.
<arg>要素について
<arg>要素については「」を参照してください.
<initMethod>要素の内容には次のものを記述することができます.
OGNL式または<arg>要素
<description>要素
<initMethod>要素にname属性でメソッド名を指定した場合は,そのメソッドの引数を<arg>要素を記述します.メソッドに引数がない場合は<arg>要素は不要です.
<initMethod>要素にname属性を指定した場合
<component class="java.util.HashMap">
<initMethod name="clear"/>
<initMethod name="put">
<arg>"key"</arg>
<arg>"value"</arg>
</initMethod>
</component>
<initMethod>要素にname属性を指定しなかった場合は,内容としてOGNL式を記述します.
OGNL式の中では,#selfという変数で<initMethod>が記述されているコンポーネントを参照することができます.
<initMethod>要素にname属性を指定しなかった場合
<component class="java.util.HashMap">
<initMethod>
#self.clear()
</initMethod>
<initMethod>
#self.put("key", "value")
</initMethod>
</component>
<initMethod>要素にname属性が指定された場合は,OGNL式が記述されていても無視されます.
<destroyMethod>要素
-destroyメソッド・インジェクション-
<destroyMethod>の適用対象
<destroyMethod>は<component>要素のinstance属性がsingletonの場合に限り有効です.
<component class="fullQualifiedClassName">
<destroyMethod
name="methodName"
>
<arg>content</arg>
<arg>content</arg>
...
</destroyMethod>
</component>
name属性 (任意): メソッドの名前を指定します.
<arg>要素について
<arg>要素については「」を参照してください.
<destroyMethod>要素の内容には次のものを記述することができます.
OGNL式または<arg>要素
<description>要素
<destroyMethod>要素にname属性でメソッド名を指定した場合は,そのメソッドの引数を<arg>要素で記述します.メソッドに引数がない場合は<arg>要素は不要です.
<destroyMethod>要素にname属性を指定した場合
<component class="java.util.HashMap">
<destroyMethod name="remove">
<arg>"key"</arg>
</destroyMethod>
</component>
<destroyMethod>要素にname属性を指定しなかった場合は,内容としてOGNL式を記述します.
OGNL式の中では,#selfという変数で<destroyMethod>が記述されているコンポーネントを参照することができます.
<destroyMethod>要素にname属性を指定しなかった場合
<component class="java.util.HashMap">
<destroyMethod>
#self.remove("key")
</destroyMethod>
</component>
<destroyMethod>要素にname属性が指定された場合は,OGNL式が記述されていても無視されます.