目次
目次
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>要素の記述された順番で適用されます.