はじめての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
呼ばれました
いずれデータベースにアクセスします。。