クイックスタート
はじめに S2Containerは,Dependency Injection (以降DIと略します) とAOP (Aspect-Oriented Programming) をサポートする軽量コンテナです. DIとは,複数のコンポーネント間の直接的な依存関係を排除し,それぞれのコンポーネントはインタフェースを通じて対話 (コラボレーション) しようという考え方です. AOPとは,コンポーネントに特有の本質的な機能 (core concern) と,ロギングなど複数のコンポーネントにまたがる機能 (cross-cutting concern) とを分離しようという考え方です. 本章では,コンソールベースの単純なアプリケーションの作成を通じて,Seasar2を紹介します. 個々のアプリケーションで利用している機能についての詳細な説明は後続の章で行います. まずはSeasar2を使ったアプリケーションの雰囲気を感じ取ってください.
はじめてのSeasar2アプリケーション 最初に作成するアプリケーションでは,Seasar2を単なるファクトリのように使用します.
コンポーネントクラス まずはコンポーネントクラスを作成します.Seasar2におけるコンポーネントは特別なクラスではなく,ごく普通のクラスです. 以下にコンポーネントクラスex01/Hello.javaを示します. 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を示します. 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"> <components> <component name="hello" class="ex01.Hello"/> </components> 設定ファイルのルート要素は<components>要素です. コンポーネントの設定を<component>要素で定義しています. <component>要素のname属性でコンポーネント名を,class属性でコンポーネントクラスを指定します. <components>要素には複数の<component>要素を定義することができます.
メインクラス アプリケーションを実行するためのメインクラスex01/Main.javaを作成します. 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"); SingletonS2ContainerFactory.init(); S2Container container = SingletonS2ContainerFactory.getContainer(); Hello hello = (Hello) container.getComponent(Hello.class); String message = hello.say(); System.out.println(message); } } 使用する設定ファイルのパスを指定します. コンテナを初期化します. コンテナを取得します. コンテナからHelloコンポーネントを取得します. Helloコンポーネントのメソッドを呼び出し,メッセージを取得します. メッセージを出力します.
実行 メインクラスを実行すると,標準出力には次のように出力されます. 実行結果 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を作成します. 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を示します. 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> </component> </components> <property>要素を使ってプロパティの値を設定しています. name属性でプロパティの名前を,要素の内容でプロパティに設定する値を指定します.
メインクラス アプリケーションを実行するためのメインクラスex02/Main.javaを作成します. 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); } }
実行 メインクラスを実行すると,標準出力には次のように出力されます. 実行結果 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!! 設定ファイルで指定したメッセージが表示されました.
DIの導入 次のアプリケーションでは,複数のコンポーネントの依存性をSeasar2によって設定します.
コンポーネントクラス 今回は,コンポーネントクラスを2つ作成します. まずはコンポーネントクラスex03/Hello.javaを作成します. 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を作成します. 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を示します. 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"> <property name="message">"Hello, DI!!"</property> </component> <component name="greeting" class="ex03.Greeting"> <property name="hello">hello</property> </component> </components> Helloコンポーネントを定義しています. Greetingコンポーネントを定義しています. <property>要素を使ってプロパティの値を設定しています. GreetingクラスのhelloプロパティにHelloクラスのコンポーネントを設定します.
メインクラス アプリケーションを実行するためのメインクラスex03/Main.javaを作成します. 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(); } }
実行 メインクラスを実行すると,標準出力には次のように出力されます. 実行結果 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から取得したメッセージを表示しました.
AOPの適用 次のアプリケーションでは,AOPを使用してコンポーネントにロギングの機能を追加します.
コンポーネントクラス 今回も,コンポーネントクラスを2つ作成します. まずはコンポーネントクラスex04/Hello.javaを作成します. 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を作成します. 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.diconGreetingクラスにAOPを適用します. 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> </component> <component name="traceInterceptor" class="org.seasar.framework.aop.interceptors.TraceInterceptor"/> </components> <adpect>要素を使ってAOPを設定しています. pointcut属性でAOPを適用するメソッドを,内容で適用するインターセプタを指定します. Greetingに適用するインターセプタを定義しています. TraceInterceptorクラスはSeasar2が提供するクラスです.
メインクラス アプリケーションを実行するためのメインクラスex04/Main.javaを作成します. 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(); } }
実行 メインクラスを実行すると,標準出力には次のように出力されます. 実行結果 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によるトレースが出力されています.
まとめ