はじめてのDIコンテナ
最近仕事でセンタに長時間ラチられるため、勉強の時間が取れず。
ようやく開始。
いきなりよくばってWebアプリとかはじめると挫折しそうなので、
バッチアプリでS2DAOをいじくるとこからはじめようと。
で、手はじめに。
ダウンロードしてきたexamplesの中に作成
Batchというインタフェースを作ります。
package examples.di;
public interface Batch {
Object execute();
}
で、その実装クラス
package examples.di.impl;
import examples.di.Batch;
public class BatchImpl implements Batch{
public Object execute() {
System.out.println("呼ばれました");
return null;
}
}
こいつを呼び出すmain文を持つクラス。
第一引数に指定された文字列でコンポーネント定義を探して
インスタンスを取得するような形です。
package examples.di.main;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;import examples.di.Batch;
public class BatchMain {
private static final String PATH = "examples/di/dicon/BatchMain.dicon";
public static void main(String[] args) {
S2Container container = S2ContainerFactory.create(PATH);
Batch bt = (Batch) container.getComponent(args[0]);
Object o = bt.execute();
}
}
で、そのコンポーネント定義。
"batch"という名前でimplクラスを定義。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN" "http://www.seasar.org/dtd/components23.dtd"> <components> <component name="batch" class="examples.di.impl.BatchImpl"> </component> </components>
でもってDIコンテナということで。
依存性を持たせます。
DataAccessObjectというインターフェースを作ります。
package examples.di; public interface DataAccessObject { Object execute(); }
実装クラスはそのうち、データベースにアクセスすることにして、、
package examples.di.impl; public class DataAccessObjectImpl { public Object execute() { System.out.println("いずれデータベースにアクセスします。。"); return null; } }
BatchImplにセッターを作ってDataAccessObjectの
インスタンスをインジェクションして呼び出す形にします。
package examples.di.impl; import examples.di.Batch; public class BatchImpl implements Batch{ private DataAccessObjectImpl daoi; public Object execute() { System.out.println("呼ばれました"); daoi.execute(); return null; } public void setDataAccessObjectImpl(DataAccessObjectImpl daoi){ this.daoi = daoi; } }
定義ファイルはpropertyタグを使ってインジェクションの定義をします。
daoiのクラス定義をcomponentタグで追加します。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN" "http://www.seasar.org/dtd/components23.dtd"> <components> <component name="batch" class="examples.di.impl.BatchImpl"> <property name="DataAccessObjectImpl">daoi</property> </component> <component name="daoi" class="examples.di.impl.DataAccessObjectImpl"> </component> </components>
んで、実行すると、、
DEBUG 2007-02-23 19:40:45,593 [main] S2Containerを作成します。path=examples/di/dicon/BatchMain.dicon
DEBUG 2007-02-23 19:40:45,765 [main] S2Containerを作成しました。path=examples/di/dicon/BatchMain.dicon
呼ばれました
いずれデータベースにアクセスします。。