新トップページへ | Tip

←戻る

前ページで書いた、「インスタンス管理方法」のcomponentタグのinstance属性の使い方例示をします。

singletonとprototypeの場合の例
outerの場合の例

singletonとprototypeの場合の例

両者の違いは以下のとおりです。
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の場合の例

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