DIの仕組みと利点を考える
ここでは、まずSeasar2の「S2Container」というクラスのインスタンスを作成しています。これが、Seasar2の「DIコンテナ」です。つまり、DIを使ってオブジェクトをコンポーネントとして組み込んでおくコンテナ、というわけですね。このDIコンテナから、利用したいコンポーネントを取り出して利用すればいいわけです。
S2ContainerFactory.createを呼び出して、指定したDiconファイルを読み込んでS2ContainerFactoryインスタンスを作成します。これで、そのDiconファイルに<component>として定義してあったものが、コンポーネントとしてDIコンテナに組み込まれます。そこから、getComponentでCalcという名前のコンポーネントを取り出します。注意しておきたいのは、ここではMyCalcではなく、「CalcClass」として取り出し利用する、という点です。インターフェイスとして取り出し利用することで、このCalcClassをimplementsしたクラスであればどんなものでも利用できるようにしておくわけです。
では、このMyCalcを更に修正したMyCalc2を用意し、これを利用してみることにしましょう。ここでは、表示の形式を少し修正したものを作成してみることにします。
※改良した計算クラス――MyCalc2.java
package jp.tuyano;
public class MyCalc2 extends MyCalc {
public String getResult() {
if (this.getData().length == 0)
return "empty.";
int[] data = this.getData();
String res = Integer.toString(data[0]);
for(int i = 1;i < data.length;i++)
res += "+" + Integer.toString(data[i]);
int n = this.getAnswer();
return res + " = " + Integer.toString(n) + ". ok?";
}
}
では、このMyCalc2を利用する形でMainを実行するようにするためにはどうすればいいでしょうか。実をいえば、Mainには一切手を加える必要はありません。修正しなければいけないのは、「S2Sample.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.MyCalc2">
</component>
</components>
diconファイルを修正するだけで、新しいMyCalc2を使って動くようになる。 |
どこを修正したかわかりますか?そう、<component>のclassの値をMyCalcからMyCalc2に変えただけです。これで、Mainを実行すれば、ちゃんとMyCalc2を使ってプログラムが動くようになります。
つまり、Seasar2を使うと、あるクラスを修正しても、それを利用している他のクラスは一切変更する必要がないのです。修正するのは、Diconファイル1つだけ。このファイルの設定を変えるだけで、使用するクラスがパッと変わってしまいます。もちろん、プログラムを再コンパイルする必要もまったくありません。
「ソースコードの変更も再コンパイルも不要」ということは、すなわち「既に運用されているプログラムの状態を、Diconファイルの定義を変えるだけで即座に変えることができる」ということでもあります。クラスが数百あるプログラムを修正する場面を想像してみてください。DIという考え方が、いかにすぐれたものかわかるでしょう?
プログラムというのは「完成したらその後永久にまったく変更せずに使い続ける」というものではありません。むしろ、さまざまなところで修正し追加しながら動かしていくものです。が、そうした修正のために膨大な時間と労力と、そしてシステムの停止・再ビルド・入れ替えといったリスクを負わなければならないのはかなり苦痛でしょう。DIを使えば、そうしたものを極力軽減させることができます。Seasar2ならば、それはわずか1個のXMLファイルの修正だけで済むのです。――いかがですか。今日から始めませんか、「DI生活」?