DIでクラスを利用する
では、先ほどのプログラムをSeasar2を利用した形で作ってみることにしましょう。まずは、MyCalcの機能を定義するインターフェイスから作成をします。
※計算クラスのインターフェイス――CalcClass.java
package jp.tuyano;
public interface CalcClass {
public void setData(int[] data);
public int[] getData();
public int getAnswer();
public String getResult();
}
ここでは、必要なメソッドを一通り定義しておきました。これをimplementsする形で、MyCalcを作成します。これは、クラスの定義部分をこのように修正するだけです。
public class MyCalc implements CalcClass {・・・略・・・}
これで、MyCalcはCalcClassを実装した形になります。使用するメソッドなどはもともとMyCalcにあったものとCalcClassに定義したものはまったく同じですから、修正の必要はありませんね。
では、このMyCalcを他のクラスから利用できるようにするために、Daiconファイルを作成しましょう。これは、Seasar2を使ってクラスを作成し利用できるようにするために必要な設定ファイルです。ここでは、MyCalcと同じjp.tuyanoパッケージ内に「S2Sample.dicon」というファイル名でDiconファイルを作成することにしましょう。
※Diconファイル――S2Sample.dicon
<?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="Calc" class="jp.tuyano.MyCalc">
</component>
</components>
ここでは、<components>というルートタグの中に、<component>というタグで使用するクラスを定義しています。このタグでは、nameという属性で名前を、classという属性で使用するクラスをそれぞれ指定しています。これで、jp.tuyano.MyCalcというクラスがCalcという名前で利用可能になります。
では、Mainクラスを修正しましょう。ここでは、直接MyCalcを利用するのでなく、Seasar2からオブジェクトをもらって利用する形になります。
※アプリケーションクラス――Main.java
package jp.tuyano;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;
public class Main {
public static void main(String[] args) {
int[] data = new int[args.length];
for(int i = 0;i < data.length;i++){
try {
data[i] = Integer.parseInt(args[i]);
} catch (NumberFormatException e) {
data[i] = 0;
}
}
S2Container container =
S2ContainerFactory.create("jp/tuyano/S2Sample.dicon");
container.init();
CalcClass calc =
(CalcClass)container.getComponent("Calc");
calc.setData(data);
System.out.println(calc.getResult());
}
}
Seasar2を使ったプログラム。Log4jが組み込まれているためデバッグ情報も出力されるが、計算結果はちゃんと表示されるのがわかる。 |
これでプログラムは完成しました。Mainを実行してMyCalcがちゃんと機能しているか確かめてみてください。先ほどのプログラムと同じように計算結果が出力されれば、Seasar2を利用してきちんとMyCalcが利用できていることが確認できます。