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