目次
目次
S2Containerは,Dependency Injection (以降DIと略します) とAOP (Aspect-Oriented Programming) をサポートする軽量コンテナです. DIとは,複数のコンポーネント間の直接的な依存関係を排除し,それぞれのコンポーネントはインタフェースを通じて対話 (コラボレーション) しようという考え方です. AOPとは,コンポーネントに特有の本質的な機能 (core concern) と,ロギングなど複数のコンポーネントにまたがる機能 (cross-cutting concern) とを分離しようという考え方です.
本章では,コンソールベースの単純なアプリケーションの作成を通じて,Seasar2を紹介します. 個々のアプリケーションで利用している機能についての詳細な説明は後続の章で行います. まずはSeasar2を使ったアプリケーションの雰囲気を感じ取ってください.
最初に作成するアプリケーションでは,Seasar2を単なるファクトリのように使用します.
まずはコンポーネントクラスを作成します.Seasar2におけるコンポーネントは特別なクラスではなく,ごく普通のクラスです.
以下にコンポーネントクラスex01/Hello.java
を示します.
例 3.1. ex01/Hello.java
package ex01; public class Hello { public String say() { return "Hello, Seasar2"; } }
say() メソッドが呼び出されると文字列を返すだけの単純なクラスです.
Seasar2を使用するには,使用するコンポーネントの情報を定義した設定ファイルを作成します.
Seasar2の標準的な設定ファイルはXML形式で記述します. この設定ファイルの拡張子は 'dicon
'
(Dependency Injection CONfiguration) となります.
以下に設定ファイルex01/app.dicon
を示します.
例 3.2. ex01/app.dicon
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> (1) <components> (2) <component name="hello" class="ex01.Hello"/> </components>
(1) | 設定ファイルのルート要素は<components>要素です. |
(2) | コンポーネントの設定を |
アプリケーションを実行するためのメインクラスex01/Main.java
を作成します.
例 3.3. ex01/Main.java
package ex01; import org.seasar.framework.container.S2Container; import org.seasar.framework.container.factory.SingletonS2ContainerFactory; public class Main { public static void main(String[] args) { SingletonS2ContainerFactory.setConfigPath("ex01/app.dicon"); (1) SingletonS2ContainerFactory.init(); (2) S2Container container = SingletonS2ContainerFactory.getContainer(); (3) Hello hello = (Hello) container.getComponent(Hello.class); (4) String message = hello.say(); (5) System.out.println(message); (6) } }
(1) | 使用する設定ファイルのパスを指定します. |
(2) | コンテナを初期化します. |
(3) | コンテナを取得します. |
(4) | コンテナから |
(5) | Helloコンポーネントのメソッドを呼び出し,メッセージを取得します. |
(6) | メッセージを出力します. |
メインクラスを実行すると,標準出力には次のように出力されます.
例 3.4. 実行結果
DEBUG 2007-02-27 20:10:23,562 [main] S2Containerを作成します。path=ex01/app.dicon
DEBUG 2007-02-27 20:10:23,750 [main] S2Containerを作成しました。path=ex01/app.dicon
INFO 2007-02-27 20:10:23,796 [main] Running on [ENV]product, [DEPLOY MODE]Normal Mode
Hello, Seasar2
Seasar2によって生成されたHello
クラスのインスタンスを取得し,say()
メソッドを呼び出すことができました.
次のアプリケーションでは,コンポーネントのプロパティにSeasar2で値を設定します.
message
という文字列型のプロパティを持ったコンポーネントクラスex02/Hello.java
を作成します.
例 3.5. ex02/Hello.java
package ex02; public class Hello { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String say() { return message; } }
設定ファイルでGreeting
クラスのmessage
プロパティにメッセージ文字列を設定します.
以下に設定ファイルex02/app.dicon
を示します.
例 3.6. ex02/app.dicon
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
"http://www.seasar.org/dtd/components24.dtd">
<components>
<component name="hello" class="ex02.Hello">
<property name="message">"Hello, Dicon!!"</property> (1)
</component>
</components>
(1) |
|
アプリケーションを実行するためのメインクラスex02/Main.java
を作成します.
例 3.7. ex02/Main.java
package ex02; import org.seasar.framework.container.S2Container; import org.seasar.framework.container.factory.SingletonS2ContainerFactory; public class Main { public static void main(String[] args) { SingletonS2ContainerFactory.setConfigPath("ex02/app.dicon"); SingletonS2ContainerFactory.init(); S2Container container = SingletonS2ContainerFactory.getContainer(); Hello hello = (Hello) container.getComponent(Hello.class); String message = hello.say(); System.out.println(message); } }
メインクラスを実行すると,標準出力には次のように出力されます.
例 3.8. 実行結果
DEBUG 2007-02-27 19:37:56,031 [main] S2Containerを作成します。path=ex02/app.dicon
DEBUG 2007-02-27 19:37:56,375 [main] S2Containerを作成しました。path=ex02/app.dicon
INFO 2007-02-27 19:37:56,437 [main] Running on [ENV]product, [DEPLOY MODE]Normal Mode
Hello, Dicon!!
設定ファイルで指定したメッセージが表示されました.
次のアプリケーションでは,複数のコンポーネントの依存性をSeasar2によって設定します.
今回は,コンポーネントクラスを2つ作成します.
まずはコンポーネントクラスex03/Hello.java
を作成します.
例 3.9. ex03/Hello.java
package ex03; public class Hello { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String say() { return message; } }
続いてコンポーネントクラスex03/Greeting.java
を作成します.
例 3.10. ex03/Greeting.java
package ex03; public class Greeting { Hello hello; public Hello getHello() { return hello; } public void setHello(Hello hello) { this.hello = hello; } public void greet() { String message = hello.say(); System.out.println(message); } }
Greeting
クラスはHello
型のプロパティを持っています
(Hello
に依存しています).
設定ファイルでHello
クラスとGreeting
クラスを定義します.
以下に設定ファイルex03/app.dicon
を示します.
例 3.11. ex03/app.dicon
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <component name="hello" class="ex03.Hello"> (1) <property name="message">"Hello, DI!!"</property> </component> <component name="greeting" class="ex03.Greeting"> (2) <property name="hello">hello</property> (3) </component> </components>
(1) | Helloコンポーネントを定義しています. |
(2) | Greetingコンポーネントを定義しています. |
(3) |
|
アプリケーションを実行するためのメインクラスex03/Main.java
を作成します.
例 3.12. ex03/Main.java
package ex03; import org.seasar.framework.container.S2Container; import org.seasar.framework.container.factory.SingletonS2ContainerFactory; public class Main { public static void main(String[] args) { SingletonS2ContainerFactory.setConfigPath("ex03/app.dicon"); SingletonS2ContainerFactory.init(); S2Container container = SingletonS2ContainerFactory.getContainer(); Greeting greeting = (Greeting) container.getComponent(Greeting.class); greeting.greet(); } }
メインクラスを実行すると,標準出力には次のように出力されます.
例 3.13. 実行結果
DEBUG 2007-02-27 20:23:11,187 [main] S2Containerを作成します。path=ex03/app.dicon
DEBUG 2007-02-27 20:23:11,406 [main] S2Containerを作成しました。path=ex03/app.dicon
INFO 2007-02-27 20:23:11,453 [main] Running on [ENV]product, [DEPLOY MODE]Normal Mode
Hello, DI!!
Greeting
はHello
から取得したメッセージを表示しました.
次のアプリケーションでは,AOPを使用してコンポーネントにロギングの機能を追加します.
今回も,コンポーネントクラスを2つ作成します.
まずはコンポーネントクラスex04/Hello.java
を作成します.
例 3.14. ex04/Hello.java
package ex04; public class Hello { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String say() { return message; } }
続いてコンポーネントクラスex04/Greeting.java
を作成します.
例 3.15. ex04/Greeting.java
package ex02; public class Greeting { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String say() { return message; } }
設定ファイルex04/app.dicon
でGreeting
クラスにAOPを適用します.
例 3.16. ex04/app.dicon
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <component name="hello" class="ex04.Hello"> <property name="message">"Hello, AOP!!"</property> </component> <component name="greeting" class="ex04.Greeting"> <property name="hello">hello</property> <aspect pointcut="greet">traceInterceptor</aspect> (1) </component> <component name="traceInterceptor" (2) class="org.seasar.framework.aop.interceptors.TraceInterceptor"/> (3) </components>
(1) |
|
(2) |
|
(3) |
|
アプリケーションを実行するためのメインクラスex04/Main.java
を作成します.
例 3.17. ex04/Main.java
package ex04; import org.seasar.framework.container.S2Container; import org.seasar.framework.container.factory.SingletonS2ContainerFactory; public class Main { public static void main(String[] args) { SingletonS2ContainerFactory.setConfigPath("ex04/app.dicon"); SingletonS2ContainerFactory.init(); S2Container container = SingletonS2ContainerFactory.getContainer(); Greeting greeting = (Greeting) container.getComponent(Greeting.class); greeting.greet(); } }
メインクラスを実行すると,標準出力には次のように出力されます.
例 3.18. 実行結果
DEBUG 2007-02-27 20:51:52,453 [main] S2Containerを作成します。path=ex04/app.dicon
DEBUG 2007-02-27 20:51:52,546 [main] S2Containerを作成します。path=aop.dicon
DEBUG 2007-02-27 20:51:52,796 [main] S2Containerを作成しました。path=aop.dicon
DEBUG 2007-02-27 20:51:52,812 [main] S2Containerを作成しました。path=ex04/app.dicon
INFO 2007-02-27 20:51:53,203 [main] Running on [ENV]product, [DEPLOY MODE]Normal Mode
DEBUG 2007-02-27 20:51:53,203 [main] BEGIN ex04.Greeting#greet()
Hello, AOP!!
DEBUG 2007-02-27 20:51:53,203 [main] END ex04.Greeting#greet() : null
Greeting
クラスのgreet()
メソッドがメッセージを出力している前後に,AOPによるトレースが出力されています.
目次
目次
DIとは,コンポーネントが他のコンポーネントに依存している場合に,その依存物 (他のコンポーネント) を外部 (S2コンテナ) から注入することです. DIを利用すると,コンポーネントが他のコンポーネントに直接依存することを避けることができます.
図
図
Dependency Injectionは,あるコンポーネントが依存する (必要とする) 他のコンポーネントをコンテナから渡されます. その際の方法として,次のものがあります.
コンストラクタ・インジェクション
セッター・メソッド
メソッド・インジェクション
図が欲しい
コンストラクタ・インジェクション
セッター・インジェクション/フィールド・インジェクション
initメソッド・インジェクション
destroyメソッド・インジェクション
目次
目次
本章では,Seasar2の標準的な設定ファイルについて説明します.
Seasar2の標準的な設定ファイルはXML形式のテキストファイルであり,dicon (Dependency Injection
CONfiguration) ファイルと呼ばれます. ファイルの拡張子は 'dicon
' です.
diconファイルは次のような構造のXMLファイルです.
<?xml version="1.0" encoding="UTF-8"?> (1) <!DOCTYPE components (2) PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" (3) "http://www.seasar.org/dtd/components24.dtd"> (4) <components> (5) ... </components>
(1) | XML宣言 (任意):diconファイルの文字エンコーディングがUTF-8以外の場合は必須となります. |
(2) | 文書型宣言 (必須):Seasar2の定義ファイルであることを示します. |
(3) | パブリックID (必須):diconファイルのパブリックIDを指定します. |
(4) | システムID (必須):diconファイルのシステムIDを指定します. |
(5) |
|
diconファイルは妥当 (valid) なXMLファイルでなくてはなりません.
diconファイルは妥当 (valid) なXMLファイルでなくてはなりません. そのため,文書型宣言が必須です. 文書型宣言で指定するDTDは,使用するSeasar2のバージョンによって,次の中から選択することができます (独自のDTDを使用することも可能です. 詳細は「」を参照してください).
表 13.1. DTDとSeasar2のバージョン
DTDのバージョン | 利用可能なSeasar2 | パブリックID |
---|---|---|
システムID | ||
2.0 | Version: 2.0~ | -//SEASAR//DTD S2Container//EN |
http://www.seasar.org/dtd/components.dtd | ||
2.1 | Version: 2.1~ | -//SEASAR2.1//DTD
S2Container//EN |
http://www.seasar.org/dtd/components21.dtd | ||
2.3 | Version: 2.3~ | -//SEASAR//DTD S2Container
2.3//EN |
http://www.seasar.org/dtd/components23.dtd | ||
2.4 | Version: 2.4~ | -//SEASAR//DTD S2Container
2.4//EN |
http://www.seasar.org/dtd/components24.dtd |
DTDによって指定可能な要素や属性およびその値が異なります. DTDのバージョンとそれぞれで利用可能な要素・属性・値を次の表に示します.
表 13.2. DTDのバージョンと指定可能な要素・属性・値
要素 | 属性 | 値 | 2.0 | 2.1 | 2.3 | 2.4 |
---|---|---|---|---|---|---|
<components> | (要素自体) | - | ○ | ○ | ○ | ○ |
namespace | - | ○ | ○ | ○ | ○ | |
initializeOnCreate | - | × | × | × | ○ | |
xmlns:xi | - | × | × | × | ○ | |
<description> | (要素自体) | - | ○ | ○ | ○ | ○ |
<include> | (要素自体) | - | ○ | ○ | ○ | ○ |
path | - | ○ | ○ | ○ | ○ | |
condition | - | × | × | ○ | ○ | |
<xi:include> | (要素自体) | - | × | × | × | ○ |
<component> | (要素自体) | - | ○ | ○ | ○ | ○ |
name | - | ○ | ○ | ○ | ○ | |
class | - | ○ | ○ | ○ | ○ | |
instance | singleton | ○ | ○ | ○ | ○ | |
prototype | ○ | ○ | ○ | ○ | ||
outer | ○ | ○ | ○ | ○ | ||
request | × | ○ | ○ | ○ | ||
session | × | ○ | ○ | ○ | ||
application | × | × | × | ○ | ||
autoBinding | auto | ○ | ○ | ○ | ○ | |
constructor | ○ | ○ | ○ | ○ | ||
property | ○ | ○ | ○ | ○ | ||
none | ○ | ○ | ○ | ○ | ||
semiauto | × | × | × | ○ | ||
externalBinding | - | × | × | × | ○ | |
<arg> | (要素自体) | - | ○ | ○ | ○ | ○ |
<property> | (要素自体) | - | ○ | ○ | ○ | ○ |
name | - | ○ | ○ | ○ | ○ | |
bindingType | - | × | × | ○ | ○ | |
<initMethod> | (要素自体) | - | ○ | ○ | ○ | ○ |
name | - | ○ | ○ | ○ | ○ | |
<destroyMethod> | (要素自体) | - | ○ | ○ | ○ | ○ |
name | - | ○ | ○ | ○ | ○ | |
<aspect> | (要素自体) | - | ○ | ○ | ○ | ○ |
pointcut | - | ○ | ○ | ○ | ○ | |
<interType> | (要素自体) | - | × | × | × | ○ |
<meta> | (要素自体) | - | × | ○ | ○ | ○ |
<components>
要素は,diconファイルのルート要素です.
<components namespace="nameSpace" (1) initializeOnCreate="false | true" (2) xmlns:xi="http://www.w3.org/2001/XInclude" (3) > ... </components>
(1) |
|
(2) |
|
(3) |
|
<components>
要素の内容には次のものを記述することができます.
<description>
要素 (任意)
<include>
要素 (0個以上)
<xi:include>
要素 (0個以上)
<component>
要素 (0個以上)
<meta>
要素 (0個以上)
<components>
要素はルート要素としてのみ記述することができます.他の要素の子となることはできません.
diconファイルに定義されたコンポーネントの名前空間を指定します. 名前空間の詳細は「」を参照してください. 名前空間を指定すると,コンテナからコンポーネントを名前で取得する際に,名前空間で修飾した名前を指定することができるようになります.
名前空間は,Javaの識別子として有効な名前を指定します. JavaBeansのプロパティ名と同じルールに従うことを推奨します.
コンテナの生成時にコンテナを初期化するかしないかを指定します.
コンテナの生成時には初期化を行いません.
コンテナの生成時に初期化を行います.
<description>
要素を使用して,diconファイルの説明を記述することができます.
<description> ... </description>
<description>
要素の内容には次のものを記述することができます.
任意のテキスト
このテキストはドキュメンテーションのためのものであり,コンテナの動作には影響を与えません.
コンテナやコンポーネント定義にメタ情報を付けることができます. メタ情報は,コンポーネントをリモートオブジェクトとして公開することを示すなど,様々な用途で使うことができます.
<meta name="name" (1) > ... </meta>
(1) | name (任意): メタ情報の名前を指定します. |
<meta>
要素の内容には次のものを記述することができます.
任意のテキスト
<description>
要素 (0個以上)
<component>
要素 (0個以上)
<meta>
要素 (0個以上)
目次
コンポーネントとは,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
がスローされます.
目次
コンストラクタ・インジェクションは,<component>
要素の子として<arg>
要素を記述することによって指定します.
<arg>
要素は,呼び出したいコンストラクタの引数の数だけ記述します.
<component class="fullQualifiedClassName"> <arg>content</arg> <arg>content</arg> ... </component>
<arg>
要素の内容には次のものを記述することができます.
OGNL式または<component>
要素
<meta>
要素 (Seasar2.1以降)
<description>
要素
<arg>
要素の内容がコンストラクタの引数として渡されます.
<arg>
要素を複数記述した場合は,その内容が記述した順番にコンストラクタ引数に渡されます.
<arg>
要素の数とその内容 (型)
を適用できるコンストラクタが存在しない場合は,org.seasar.framework.beans.ConstructorNotFoundRuntimeException
がスローされます.
<component>
要素にインスタンス生成式 (OGNL式)
を記述した場合は,<arg>
要素が記述されていても無視されます.
<arg>
要素の内容にOGNL式と<component>
要素の両方を記述した場合,<component>
要素は無視されます.
<component class="fullQualifiedClassName"> <property name="propertyName" (1) bindingType="must | should | may | none" (2) > content </property> </component>
(1) |
|
(2) |
|
<property>要素の内容には次のものを記述することができます.
OGNL式または<component>
要素
<meta>
要素 (Seasar2.1以降)
<description>
要素
<property>
要素の内容にOGNL式と<component>
要素の両方を記述した場合,<component>
要素は無視されます.
<component class="fullQualifiedClassName"> <initMethod name="methodName" (1) > <arg>content</arg> <arg>content</arg> ... </initMethod> </component>
(1) |
|
<initMethod>
要素の内容には次のものを記述することができます.
OGNL式または<arg>
要素
<description>
要素
<initMethod>
要素にname
属性でメソッド名を指定した場合は,そのメソッドの引数を<arg>
要素を記述します.メソッドに引数がない場合は<arg>
要素は不要です.
例 15.1. <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>
が記述されているコンポーネントを参照することができます.
例 15.2. <initMethod>
要素にname
属性を指定しなかった場合
<component class="java.util.HashMap"> <initMethod> #self.clear() </initMethod> <initMethod> #self.put("key", "value") </initMethod> </component>
<initMethod>
要素にname
属性が指定された場合は,OGNL式が記述されていても無視されます.
<component class="fullQualifiedClassName"> <destroyMethod name="methodName" (1) > <arg>content</arg> <arg>content</arg> ... </destroyMethod> </component>
(1) |
|
<destroyMethod>
要素の内容には次のものを記述することができます.
OGNL式または<arg>
要素
<description>
要素
<destroyMethod>
要素にname
属性でメソッド名を指定した場合は,そのメソッドの引数を<arg>
要素で記述します.メソッドに引数がない場合は<arg>
要素は不要です.
例 15.3. <destroyMethod>
要素にname
属性を指定した場合
<component class="java.util.HashMap"> <destroyMethod name="remove"> <arg>"key"</arg> </destroyMethod> </component>
<destroyMethod>
要素にname
属性を指定しなかった場合は,内容としてOGNL式を記述します.
OGNL式の中では,#self
という変数で<destroyMethod>
が記述されているコンポーネントを参照することができます.
例 15.4. <destroyMethod>
要素にname
属性を指定しなかった場合
<component class="java.util.HashMap"> <destroyMethod> #self.remove("key") </destroyMethod> </component>
<destroyMethod>
要素にname
属性が指定された場合は,OGNL式が記述されていても無視されます.
<component class="fullQualifiedClassName"> <aspect pointcut="pointcut" (1) > content </aspect> </component>
(1) |
|
<aspect>
要素の内容には次のものを記述することができます.
OGNL式または<component>
要素
<description>
要素
<aspect>
要素の内容にOGNL式と<component>
要素の両方を記述した場合,<component>
要素は無視されます.
<component>
要素には複数の<aspect>
要素を記述することができます.
その場合,複数の<aspect>
要素のpointcut
属性で選択されたメソッドには,
複数のインターセプタが<aspect>
要素の記述された順番で適用されます.
インターセプタを適用するメソッドを正規表現で指定します. 正規表現はカンマ区切りで複数並べることができます.
次の例では,do
で始まるメソッドとinit
で始まるpublic
メソッドが選択されます.
<component name="hoge"> <aspect pointcut="do.*,init.*">traceInterceptor</aspect> </component>
オーバーライドされたメソッドの一部だけを選択することはdiconではできません. 同名のメソッドは全部選択されます
(ただしpublic
メソッドのみ).
アノテーションでは特定のメソッドだけを選択することができます.「」
<component class="fullQualifiedClassName"> <intertype> content </interType> </component>
<interType>
要素の内容には次のものを記述することができます.
OGNL式または<component>
要素
<description>
要素
<interType>
要素の内容にOGNL式と<component>
要素の両方を記述した場合,<component>
要素は無視されます.
<component>
要素には複数の<interType>
要素を記述することができます.
その場合,
複数のインタータイプが<interType>
要素の記述された順番で適用されます.