Seasar2 Reference Documentation

DI Container with AOP

Version: 2.4


目次

I. Seasar2の紹介
1. 概要
1.1.
1.2.
2. セットアップ
2.1.
3. クイックスタート
3.1. はじめに
3.2. はじめてのSeasar2アプリケーション
3.3. プロパティの設定
3.4. DIの導入
3.5. AOPの適用
3.6. まとめ
4. アーキテクチャ
4.1.
II. S2コンテナ
5. 概要
5.1.
5.2.
6. Dependency Injection
6.1. はじめに
6.2. Dependency Injection概要
6.3. Dependency Injectionのタイプ
6.4. ライフサイクルとDI
6.5. 自動バインディング
6.6. 特殊なコンポーネント
6.7. 外部バインディング
6.8. まとめ
7. Aspect-Oriented Programming
7.1.
7.2. インターセプタの作成
7.3. インタータイプの作成
7.4. 標準インターセプタ
7.5. 標準インタータイプ
8. S2コンテナの作成
8.1.
8.2.
9. S2コンテナの利用
9.1.
9.2.
10. シングルトンS2コンテナ
10.1.
10.2.
11. 外部コンテキスト
11.1.
11.2.
III. 設定
12. 概要
12.1.
12.2.
13. diconファイル
13.1. はじめに
13.2. 基本構造
13.3. 文書型宣言
13.4. <components>要素
13.5. <description>要素
13.6. <meta>要素
13.7. まとめ
14. コンポーネント定義
14.1. はじめに
14.2. コンポーネント
14.3. <component>要素
14.4. まとめ
15. DI定義
15.1. はじめに
15.2. <arg>要素
15.3. <property>要素
15.4. <initMethod>要素
15.5. <destroyMethod>要素
15.6. まとめ
16. AOP定義
16.1. はじめに
16.2. <aspect>要素
16.3. <interType>要素
16.4. まとめ
17. OGNL
17.1.
17.2.
18. アノテーション
18.1.
18.2.
19. diconファイルの分割と編成
19.1.
19.2.
20. SMART deploy
20.1.
20.2.
21. コンポーネントの自動登録
21.1.
21.2.
22. S2コンテナのカスタマイズ
22.1.
22.2.
IV. Web
V. データアクセス
VI.
VII. テスト
VIII. for Framework Programmer
索引

パート I. Seasar2の紹介

第1章 概要

1.1.

1.2.

第2章 セットアップ

目次

2.1.

2.1.

第3章 クイックスタート

3.1. はじめに

S2Containerは,Dependency Injection (以降DIと略します) とAOP (Aspect-Oriented Programming) をサポートする軽量コンテナです. DIとは,複数のコンポーネント間の直接的な依存関係を排除し,それぞれのコンポーネントはインタフェースを通じて対話 (コラボレーション) しようという考え方です. AOPとは,コンポーネントに特有の本質的な機能 (core concern) と,ロギングなど複数のコンポーネントにまたがる機能 (cross-cutting concern) とを分離しようという考え方です.

本章では,コンソールベースの単純なアプリケーションの作成を通じて,Seasar2を紹介します. 個々のアプリケーションで利用している機能についての詳細な説明は後続の章で行います. まずはSeasar2を使ったアプリケーションの雰囲気を感じ取ってください.

3.2. はじめてのSeasar2アプリケーション

最初に作成するアプリケーションでは,Seasar2を単なるファクトリのように使用します.

3.2.1. コンポーネントクラス

まずはコンポーネントクラスを作成します.Seasar2におけるコンポーネントは特別なクラスではなく,ごく普通のクラスです.

以下にコンポーネントクラスex01/Hello.javaを示します.

例 3.1. ex01/Hello.java

package ex01;

public class Hello {
    public String say() {
        return "Hello, Seasar2";
    }
}

say() メソッドが呼び出されると文字列を返すだけの単純なクラスです.

3.2.2. 設定ファイル

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)

コンポーネントの設定を<component>要素で定義しています. <component>要素のname属性でコンポーネント名を,class属性でコンポーネントクラスを指定します. <components>要素には複数の<component>要素を定義することができます.


3.2.3. メインクラス

アプリケーションを実行するためのメインクラス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)

コンテナからHelloコンポーネントを取得します.

(5)

Helloコンポーネントのメソッドを呼び出し,メッセージを取得します.

(6)

メッセージを出力します.


3.2.4. 実行

メインクラスを実行すると,標準出力には次のように出力されます.

例 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()メソッドを呼び出すことができました.

3.3. プロパティの設定

次のアプリケーションでは,コンポーネントのプロパティにSeasar2で値を設定します.

3.3.1. コンポーネントクラス

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;
    }
}

3.3.2. 設定ファイル

設定ファイルで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)

<property>要素を使ってプロパティの値を設定しています. name属性でプロパティの名前を,要素の内容でプロパティに設定する値を指定します.


3.3.3. メインクラス

アプリケーションを実行するためのメインクラス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.3.4. 実行

メインクラスを実行すると,標準出力には次のように出力されます.

例 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!!

設定ファイルで指定したメッセージが表示されました.

3.4. DIの導入

次のアプリケーションでは,複数のコンポーネントの依存性をSeasar2によって設定します.

3.4.1. コンポーネントクラス

今回は,コンポーネントクラスを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に依存しています).

3.4.2. 設定ファイル

設定ファイルで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)

<property>要素を使ってプロパティの値を設定しています. GreetingクラスのhelloプロパティにHelloクラスのコンポーネントを設定します.


3.4.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.4.4. 実行

メインクラスを実行すると,標準出力には次のように出力されます.

例 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!!

GreetingHelloから取得したメッセージを表示しました.

3.5. AOPの適用

次のアプリケーションでは,AOPを使用してコンポーネントにロギングの機能を追加します.

3.5.1. コンポーネントクラス

今回も,コンポーネントクラスを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;
    }
}

3.5.2. 設定ファイル

設定ファイルex04/app.diconGreetingクラスに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)

<adpect>要素を使ってAOPを設定しています. pointcut属性でAOPを適用するメソッドを,内容で適用するインターセプタを指定します.

(2)

Greetingに適用するインターセプタを定義しています.

(3)

TraceInterceptorクラスはSeasar2が提供するクラスです.


3.5.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.5.4. 実行

メインクラスを実行すると,標準出力には次のように出力されます.

例 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によるトレースが出力されています.

3.6. まとめ

第4章 アーキテクチャ

目次

4.1.

4.1.

パート II. S2コンテナ

第5章 概要

5.1.

5.2.

第6章 Dependency Injection

-依存性の注入-

6.1. はじめに

本章では,Dependency Injection (依存性の注入,以下DI) の利用方法について説明します.

6.2. Dependency Injection概要

DIとは,コンポーネントが他のコンポーネントに依存している場合に,その依存物 (他のコンポーネント) を外部 (S2コンテナ) から注入することです. DIを利用すると,コンポーネントが他のコンポーネントに直接依存することを避けることができます.

6.3. Dependency Injectionのタイプ

Dependency Injectionは,あるコンポーネントが依存する (必要とする) 他のコンポーネントをコンテナから渡されます. その際の方法として,次のものがあります.

  • コンストラクタ・インジェクション

  • セッター・メソッド

  • メソッド・インジェクション

6.3.1. コンストラクタ・インジェクション

コンストラクタ・インジェクションでは,コンストラクタを通じて依存するコンポーネントが設定されます.

6.3.2. セッター・インジェクション

セッター・インジェクションでは,プロパティのセッター・メソッドを通じて依存するコンポーネントが設定されます.

6.3.3. メソッド・インジェクション

メソッド・インジェクションでは,任意のメソッドを通じて依存するコンポーネントが設定されます.

メソッド・インジェクション

6.3.4. フィールド・インジェクション

フィールド・インジェクションでは,任意のフィールドに直接コンポーネントが設定されます. フィールド・インジェクションはdiconファイルで指定することはできません. フィールド・インジェクションを使用するにはアノテーションを指定します.

6.4. ライフサイクルとDI

図が欲しい

  • コンストラクタ・インジェクション

  • セッター・インジェクション/フィールド・インジェクション

  • initメソッド・インジェクション

  • destroyメソッド・インジェクション

6.5. 自動バインディング

6.5.1.

6.5.2. バインディング・タイプ

must

should (デフォルト)

may

none

6.5.3. 依存コンポーネントの解決

  • 名前

6.5.4. 自動バインディング・モード

auto

constructor

property

none

semiauto (Version: 2.4~)

6.6. 特殊なコンポーネント

6.6.1. S2Container

6.6.2. ComponentDef

6.7. 外部バインディング

6.8. まとめ

第7章 Aspect-Oriented Programming

-アスペクト指向プログラミング-

7.1.

7.2. インターセプタの作成

7.3. インタータイプの作成

7.4. 標準インターセプタ

7.5. 標準インタータイプ

第8章 S2コンテナの作成

8.1.

8.2.

第9章 S2コンテナの利用

9.1.

9.2.

第10章 シングルトンS2コンテナ

10.1.

10.2.

第11章 外部コンテキスト

11.1.

11.2.

パート III. 設定

第12章 概要

12.1.

12.2.

第13章 diconファイル

13.1. はじめに

本章では,Seasar2の標準的な設定ファイルについて説明します.

Seasar2の標準的な設定ファイルはXML形式のテキストファイルであり,dicon (Dependency Injection CONfiguration) ファイルと呼ばれます. ファイルの拡張子は 'dicon' です.

13.2. 基本構造

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)

<components>要素 (必須):diconファイルのルート要素です.

diconファイルは妥当 (valid) なXMLファイルでなくてはなりません.

13.3. 文書型宣言

diconファイルは妥当 (valid) なXMLファイルでなくてはなりません. そのため,文書型宣言が必須です. 文書型宣言で指定するDTDは,使用するSeasar2のバージョンによって,次の中から選択することができます (独自のDTDを使用することも可能です. 詳細は「」を参照してください).

表 13.1. DTDとSeasar2のバージョン

DTDのバージョン利用可能なSeasar2パブリックID
システムID
2.0Version: 2.0~-//SEASAR//DTD S2Container//EN
http://www.seasar.org/dtd/components.dtd
2.1Version: 2.1~-//SEASAR2.1//DTD S2Container//EN
http://www.seasar.org/dtd/components21.dtd
2.3Version: 2.3~-//SEASAR//DTD S2Container 2.3//EN
http://www.seasar.org/dtd/components23.dtd
2.4Version: 2.4~-//SEASAR//DTD S2Container 2.4//EN
http://www.seasar.org/dtd/components24.dtd

DTDによって指定可能な要素や属性およびその値が異なります. DTDのバージョンとそれぞれで利用可能な要素・属性・値を次の表に示します.

表 13.2. DTDのバージョンと指定可能な要素・属性・値

要素属性2.02.12.32.4
<components>(要素自体)-
namespace-
initializeOnCreate-×××
xmlns:xi-×××
<description>(要素自体)-
<include>(要素自体)-
path-
condition-××
<xi:include>(要素自体)-×××
<component>(要素自体)-
name-
class-
instancesingleton
prototype
outer
request×
session×
application×××
autoBindingauto
constructor
property
none
semiauto×××
externalBinding-×××
<arg>(要素自体)-
<property>(要素自体)-
name-
bindingType-××
<initMethod>(要素自体)-
name-
<destroyMethod>(要素自体)-
name-
<aspect>(要素自体)-
pointcut-
<interType>(要素自体)-×××
<meta>(要素自体)-×

13.4. <components>要素

-コンテナ定義-

<components>要素は,diconファイルのルート要素です.

<components
    namespace="nameSpace"                                                                (1)
    initializeOnCreate="false | true"                                                    (2)
    xmlns:xi="http://www.w3.org/2001/XInclude"                                           (3)
>
    ...
</components>
(1)

namespace (任意): このdiconファイルを読み込んだコンテナの名前空間を指定します.

(2)

initializeOnCreate (任意): コンテナの作成時に初期化も行うことを指定します. デフォルトはfalseです.

(3)

xmlns:xi (任意): XIncludeで使用する名前空間を宣言します.

<components>要素の内容には次のものを記述することができます.

  • <description>要素 (任意)

  • <include>要素 (0個以上)

  • <xi:include>要素 (0個以上)

  • <component>要素 (0個以上)

  • <meta>要素 (0個以上)

<components>要素はルート要素としてのみ記述することができます.他の要素の子となることはできません.

13.4.1. namespace属性

-名前空間-

diconファイルに定義されたコンポーネントの名前空間を指定します. 名前空間の詳細は「」を参照してください. 名前空間を指定すると,コンテナからコンポーネントを名前で取得する際に,名前空間で修飾した名前を指定することができるようになります.

名前空間は,Javaの識別子として有効な名前を指定します. JavaBeansのプロパティ名と同じルールに従うことを推奨します.

13.4.2. initializeOnCreate属性

-生成時に初期化-

(Version: 2.4.5~)

コンテナの生成時にコンテナを初期化するかしないかを指定します.

false (デフォルト)

コンテナの生成時には初期化を行いません.

true

コンテナの生成時に初期化を行います.

13.4.3. xmlns:xi属性

-XInclude名前空間宣言-

(Version: 2.4.0~)

XIncludeを使用する場合は,その名前空間を宣言します (). 名前空間接頭辞は 'xi' だけが利用可能です. 名前空間URIは 'http://www.w3.org/2001/XInclude' を指定します. この名前空間はXML名前空間仕様のものであり,namespace属性で指定するコンポーネントの名前空間とは別のものです. XIncludeの詳細は「」を参照してください.

13.5. <description>要素

-説明-

<description>要素を使用して,diconファイルの説明を記述することができます.

<description>
    ...
</description>

<description>要素の内容には次のものを記述することができます.

  • 任意のテキスト

このテキストはドキュメンテーションのためのものであり,コンテナの動作には影響を与えません.

13.6. <meta>要素

-メタ情報-

(Version: 2.1.0~)

コンテナやコンポーネント定義にメタ情報を付けることができます. メタ情報は,コンポーネントをリモートオブジェクトとして公開することを示すなど,様々な用途で使うことができます.

<meta
    name="name"                                                                          (1)
>
    ...
</meta>
(1)

name (任意): メタ情報の名前を指定します.

<meta>要素の内容には次のものを記述することができます.

  • 任意のテキスト

  • <description>要素 (0個以上)

  • <component>要素 (0個以上)

  • <meta>要素 (0個以上)

13.6.1. name属性

-メタ情報名-

メタ情報は名前を持つことができます. この名前はコンテナやコンポーネント定義からメタ情報を取得する際のキーとして使うことができます.

13.7. まとめ

第14章 コンポーネント定義

14.1. はじめに

本章では,diconファイルでコンポーネントを定義する方法について説明します.

14.2. コンポーネント

コンポーネントとは,S2コンテナに管理されるオブジェクトのことです.

S2コンテナで管理可能なコンポーネントは特別なクラスである必要はなく,ほとんどのJavaクラスをコンポーネントとして扱うことが可能です.

14.3. <component>要素

-コンポーネント定義-

コンポーネントは<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)

name (任意): コンポーネントの名前を指定します.

(2)

class (任意): コンポーネントのクラス名 (完全限定名) を指定します.

(3)

instance (任意): インスタンス・モードを指定します. デフォルトはsingletonです.

(4)

autoBinding (任意): 自動バインディング・モードを指定します.デフォルトはautoです.

(5)

externalBinding (任意): 外部バインディング・モードを指定します. デフォルトはfalseです.

<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>要素以外の要素の子として定義したコンポーネントは,他のコンポーネントから参照することができません.

14.3.1. name属性

-コンポーネント名-

コンポーネントは名前を持つことができます. この名前は,コンテナからコンポーネントを取得する際のキーとして使うことができます (). また,自動バインディグの際にはプロパティ名とのマッチングに使用されます (). インスタンス・モードがrequestsessionapplicationの場合,コンポーネント名は必須です.

コンポーネント名は,Javaの識別子として有効な名前を指定します. JavaBeansのプロパティ名と同じルールに従うことを推奨します.

コンポーネント名は,<components>要素の直下に定義されたコンポーネント定義の場合のみ有効です. <property>要素など,他の要素の子として定義された<component>要素では,name属性は無視されます.

14.3.2. class属性

-コンポーネント・クラス-

コンポーネントのクラスを指定することができます. この指定の必要性と解釈は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がスローされます.
なし外部から渡されるインスタンスがコンポーネントとなります.

14.3.3. instance属性

-インスタンス・モード-

インスタンス・モードとして,コンポーネントのスコープを指定することができます.

指定可能な値を次に示します.

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に設定し,それをコンポーネントとして返します. 属性が存在すれば,それをコンポーネントとして返します.

14.3.4. autoBinding属性

-自動バインディング・モード-

自動バインディングのモードを指定することができます. 自動バインディングの詳細は「」を参照してください.

autoBinding属性に指定可能な値を次に示します.

auto (デフォルト)

コンストラクタ・インジェクションとセッター・インジェクションの両方に自動バインディングが適用されます.

constructor

コンストラクタ・インジェクションに対してのみ,自動バインディングが適用されます.

property

セッター・インジェクションに対してのみ,自動バインディングが適用されます.

none

自動バインディングは適用されません.

semiauto (Seasar2.4以降)

アノテーション等で明示的に指定されたプロパティに対してのみ,自動バインディングが適用されます.

14.3.5. externalBinding属性

-外部バインディング・モード-

(Version: 2.4.0~)

外部バインディングを使用するかどうかを指定することができます. 外部バインディングの詳細は「」を参照してください.

externalBinding属性に指定可能な値を次に示します.

false (デフォルト)

外部バインディングを使用しません.

true

外部バインディングを使用します.

14.3.6. インスタンス生成式

<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がスローされます.

14.4. まとめ

第15章 DI定義

-依存性の注入-

15.1. はじめに

本章では,DI (Dipendency Injection,依存性の注入) の利用方法について説明します.Seasar2が提供するDIの詳細は「」を参照してください.

15.2. <arg>要素

-コンストラクタ・インジェクション-

コンストラクタ・インジェクションは,<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>要素は無視されます.

15.3. <property>要素

-セッター・インジェクション-

<component class="fullQualifiedClassName">
  <property
    name="propertyName"                                                                  (1)
    bindingType="must | should | may | none"                                             (2)
  >
    content
  </property>
</component>
(1)

name (必須): プロパティの名前を指定します.

(2)

bindingType (任意): バインディング・タイプを指定します.デフォルトはshouldです.

<property>要素の内容には次のものを記述することができます.

  • OGNL式または<component>要素

  • <meta>要素 (Seasar2.1以降)

  • <description>要素

<property>要素の内容にOGNL式と<component>要素の両方を記述した場合,<component>要素は無視されます.

15.3.1. name属性

-プロパティ名-

15.3.2. bindingType属性

-バインディング・タイプ-

(Version: 2.3.0~)

must

should (デフォルト)

may

none

15.4. <initMethod>要素

-initメソッド・インジェクション-

<component class="fullQualifiedClassName">
  <initMethod
    name="methodName"                                                                    (1)
  >
    <arg>content</arg>
    <arg>content</arg>
    ...
  </initMethod>
</component>
(1)

name属性 (任意): メソッドの名前を指定します.

<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式が記述されていても無視されます.

15.5. <destroyMethod>要素

-destroyメソッド・インジェクション-

<component class="fullQualifiedClassName">
  <destroyMethod
    name="methodName"                                                                    (1)
  >
    <arg>content</arg>
    <arg>content</arg>
    ...
  </destroyMethod>
</component>
(1)

name属性 (任意): メソッドの名前を指定します.

<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式が記述されていても無視されます.

15.6. まとめ

第16章 AOP定義

-アスペクト指向プログラミング-

16.1. はじめに

16.2. <aspect>要素

アスペクト

<component class="fullQualifiedClassName">
  <aspect
    pointcut="pointcut"                                                                  (1)
  >
    content
  </aspect>
</component>
(1)

pointcut (任意): インターセプタを適用するメソッドを選択するためのポイントカットを指定します.

<aspect>要素の内容には次のものを記述することができます.

  • OGNL式または<component>要素

  • <description>要素

<aspect>要素の内容にOGNL式と<component>要素の両方を記述した場合,<component>要素は無視されます.

<component>要素には複数の<aspect>要素を記述することができます. その場合,複数の<aspect>要素のpointcut属性で選択されたメソッドには, 複数のインターセプタが<aspect>要素の記述された順番で適用されます.

16.2.1. pointcut属性

-ポイントカット-

インターセプタを適用するメソッドを正規表現で指定します. 正規表現はカンマ区切りで複数並べることができます.

次の例では,doで始まるメソッドとinitで始まるpublicメソッドが選択されます.

<component name="hoge">
  <aspect pointcut="do.*,init.*">traceInterceptor</aspect>
</component>

オーバーライドされたメソッドの一部だけを選択することはdiconではできません. 同名のメソッドは全部選択されます (ただしpublicメソッドのみ). アノテーションでは特定のメソッドだけを選択することができます.「」

16.3. <interType>要素

-インタータイプ-

(Version: 2.4.0~)

<component class="fullQualifiedClassName">
  <intertype>
    content
  </interType>
</component>

<interType>要素の内容には次のものを記述することができます.

  • OGNL式または<component>要素

  • <description>要素

<interType>要素の内容にOGNL式と<component>要素の両方を記述した場合,<component>要素は無視されます.

<component>要素には複数の<interType>要素を記述することができます. その場合, 複数のインタータイプが<interType>要素の記述された順番で適用されます.

16.4. まとめ

第17章 OGNL

17.1.

17.2.

第18章 アノテーション

18.1.

18.2.

第19章 diconファイルの分割と編成

19.1.

19.2.

第20章 SMART deploy

20.1.

20.2.

第21章 コンポーネントの自動登録

21.1.

21.2.

第22章 S2コンテナのカスタマイズ

22.1.

22.2.

パート IV. Web

  • overview

  • S2ContainerServlet

  • S2ContainerFilter

  • Portlet

パート V. データアクセス

  • overview

  • transaction management

  • declarative transaction

  • connection pooling

  • jdbc

パート VI. 

  • overview

  • EJB3

  • S2Dxo

  • standard components

  • standard dicons

パート VII. テスト

  • overview

  • S2Unit

  • S2Unit4

  • S2Dataset

パート VIII. for Framework Programmer

  • overview

  • logging

  • S2ContainerBuilder

索引