新トップページへ | Tip
←戻る
前ページで書いた、「インスタンス管理方法」のcomponentタグのinstance属性の使い方例示をします。
singletonとprototypeの場合の例
outerの場合の例
両者の違いは以下のとおりです。
singleton → S2コンテナに対しgetComponentした場合、S2Containerがインスタンスを1作成し、それを、常に返す。
prototype → S2コンテナに対しgetComponentした場合、getComponentされるたびにS2Containerがインスタンスを作成し、それを返す。
singletonの場合、インスタンス生成の際、メソッド・インジェクションで初期化処理の記述、diconファイル内のdestroyMethod設定で、インスタンス破棄時の終了処理を指定可能です(その例もサンプル内に含まれています)。
以下に例を示します。
EntryPoint.java |
package sample6;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;
/**
* componentタグのinstance属性が"singleton"の場合の例.
*/
public class EntryPoint {
public static void main(String[] args) {
String path = "sample6/sample.dicon";
System.out.println("------------- start -------------");
// S2Containerを初期化する
S2Container container = S2ContainerFactory.create(path);
container.init();
System.out.println("処理を開始します...");
// singletonのインスタンスを取得する
System.out.println("singleton --------------------------");
sleep(); // 実行結果に時間の差が出るようにスリープをいれる
DoWork work1 = (DoWork)container.getComponent("doWork1");
work1.doWork();
sleep(); // 実行結果に時間の差が出るようにスリープをいれる
work1 = (DoWork)container.getComponent("doWork1");
work1.doWork();
sleep(); // 実行結果に時間の差が出るようにスリープをいれる
// prototypeインスタンスを取得する
System.out.println("prototype --------------------------");
DoWork work2 = (DoWork)container.getComponent("doWork2");
work2.doWork();
sleep(); // 実行結果に時間の差が出るようにスリープをいれる
work2 = (DoWork)container.getComponent("doWork2");
work2.doWork();
// S2Containerの終了処理を実行する
container.destroy();
System.out.println("------------- finish -------------");
}
private static void sleep() {
try {
Thread.sleep(1000L);
} catch(Exception e) { e.printStackTrace(); }
}
}
|
DoWork.java |
package sample6;
public interface DoWork {
public void doWork();
}
|
DoWorkImpl.java |
package sample6;
import java.util.Date;
public class DoWorkImpl implements DoWork {
private Date date;
/** デフォルトコンストラクタ. */
public DoWorkImpl() {
date = new Date();
}
public void doWork() {
System.out.println("DoWorkImpl#doWork()だよ!");
System.out.println("date : "+date);
}
/** メソッド・インジェクション用のメソッド. */
public void createProcess(String msg) {
System.out.println("++++++++++++++");
System.out.println("DoWorkImpl#createProcess : "+msg);
System.out.println("date : "+date);
System.out.println("++++++++++++++");
}
/** コンテナの終了処理時に呼び出されるメソッド. */
public void destroyProcess(String msg) {
System.out.println("++++++++++++++");
System.out.println("DoWorkImpl#destoryProcess : "+msg);
System.out.println("date : "+date);
System.out.println("++++++++++++++");
}
}
|
sample.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 namespace="sample">
<component name="doWork1" class="sample6.DoWorkImpl" instance="singleton">
<initMethod name = "createProcess">
<arg>"任意の引数を指定することもできるよ!(createProcess)"</arg>
</initMethod>
<destroyMethod name = "destroyProcess">
<arg>"任意の引数を指定することもできるよ!(destroyMethod)"</arg>
</destroyMethod>
</component>
<component name="doWork2" class="sample6.DoWorkImpl" instance="prototype"/>
</components>
|
■実行結果 |
------------- start -------------
DEBUG 2012-03-10 22:13:35,862 [main] S2Containerを作成します。path=sample6/sample.dicon
DEBUG 2012-03-10 22:13:36,323 [main] S2Containerを作成しました。path=sample6/sample.dicon
++++++++++++++
DoWorkImpl#createProcess : 任意の引数を指定することもできるよ!(createProcess)
date : Sat Mar 10 22:13:36 JST 2012
++++++++++++++
処理を開始します...
singleton --------------------------
DoWorkImpl#doWork()だよ!
date : Sat Mar 10 22:13:36 JST 2012
DoWorkImpl#doWork()だよ!
date : Sat Mar 10 22:13:36 JST 2012
prototype --------------------------
DoWorkImpl#doWork()だよ!
date : Sat Mar 10 22:13:39 JST 2012
DoWorkImpl#doWork()だよ!
date : Sat Mar 10 22:13:40 JST 2012
++++++++++++++
DoWorkImpl#destoryProcess : 任意の引数を指定することもできるよ!(destroyMethod)
date : Sat Mar 10 22:13:36 JST 2012
++++++++++++++
------------- finish -------------
|
outerを指定すると、インジェクションのみを行うクラスであることを示します。
利用者がインスタンスを生成し、そのインスタンスをS2コンテナに渡すと、セッター・インジェクション、もしくはメソッド・インジェクションにより、DIをしてくれます。
以下に例を示します。
EntryPoint.java |
package sample7;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;
/**
* componentタグのinstance属性が"outer"の場合の例.
*/
public class EntryPoint {
public static void main(String[] args) {
String path = "sample7/sample.dicon";
System.out.println("------------- start -------------");
// S2Containerを初期化する
S2Container container = S2ContainerFactory.create(path);
container.init();
Worker worker = new Worker();
container.injectDependency(worker);
worker.proccess();
System.out.println("------------- finish -------------");
}
}
|
Worker.java |
package sample7;
public class Worker {
private DoWork doWork;
public void setDoWork(DoWork doWork) {
this.doWork = doWork;
}
public void proccess() {
System.out.println("Worker#proccess start");
doWork.doWork();
System.out.println("Worker#proccess finish");
}
}
|
DoWork.java |
package sample7;
public interface DoWork {
public void doWork();
}
|
DoWorkImpl.java |
package sample7;
import java.util.Date;
public class DoWorkImpl implements DoWork {
private Date date;
/** デフォルトコンストラクタ. */
public DoWorkImpl() {
date = new Date();
}
public void doWork() {
System.out.println("DoWorkImpl#doWork()だよ!");
System.out.println("date : "+date);
}
}
|
sample.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 namespace="sample">
<component class="sample7.DoWorkImpl"/>
<component name="worker" class="sample7.Worker" instance="outer"/>
</components>
|
■実行結果 |
------------- start -------------
DEBUG 2012-02-26 03:00:20,714 [main] S2Containerを作成します。path=sample7/sample.dicon
DEBUG 2012-02-26 03:00:20,797 [main] S2Containerを作成しました。path=sample7/sample.dicon
Worker#proccess start
DoWorkImpl#doWork()だよ!
date : Sun Feb 26 03:00:20 JST 2012
Worker#proccess finish
------------- finish -------------
|