DIってありますよね。依存性の注入というもので、
プログラムはふつう
呼び出し側(クライアント)→部品(コンポーネント)
っていう具合に書くので、呼び出し側にクラス(関数名)が入ってしまい、結合が密になってしまい、修正しにくい(ただし、XML-RPCなどアプリケーションをサーバーから呼び出す場合やリフレクションを使う場合は、この限りではない)。そこで、逆に
呼び出し側(クライアント)←プログラム(コンポーネント)
ということを実現する(矢印の方向が違う)、これが依存性の注入で、どうするかというと、
・部品となるプログラムについて記述した設定ファイルをかいて、
・クライアントにそれを読み込みませ
・そこに記述された部品(コンポーネント)をとって(get)くる
→注入してもらう
っていう形をとればいい(それって、ファイルみて、リフレクションしているだけじゃん!っていうツッコミは受け付けません ^^;)。
まあ、本当は、もっといい説明があると思うが、そのへんは、DIや依存性の注入ってことばで、ヤフってみてください(某検索会社の名称を言うといけないそうなので、ヤフっとくという表現にしました)
さて、この依存性の注入というDIのフレームワーク、フリーだと、「Spring」や、「Seasar2」というのがありますよね(だから、リフレクションさせて、自分で作ればいいじゃんという人は、自分で作っててください ^^ 今日は、リフレクションの話題は書きませんので)。
で、この比較をしてみたいとおもいます。どれが、どうなっているのか。。
っていうことで、まったく同じ内容を、書いてみたら、どうなるかっていうのを示せばわかりやすいですよね。そこで、Springについては、
Spring Frameworkで理解するDI(1)
DI:依存性の注入とは何か?
SpringFrameworkを使ったサンプル
http://www.atmarkit.co.jp/fjava/rensai3/springdi01/springdi01_2.html
に、サンプルプログラムがあるので、これと、まったく同じ内容を「Seasar2」で表現してみました。
クラス名は、SpringTestをSeasarTestに変えただけ(Targetは同じ)、設定ファイルはxmlをdiconにしました。
「Seasar2」の人たちから見れば、邪道な書き方だとは思いますが(こう書くべきでは、たぶんないような気がする)単純に同じものを比較しやすくするために、こうやって書いてみました。
(はい、それにどういう意味があるんだ。まったく違うもんだああ。。っていう両陣営からのお怒りの言葉があることは100も承知ですが、比較してみたい年頃なんです。はい)
てなわけで、以下、Seasar側のお話
■設定について
Seasarは、
ここ http://s2container.seasar.org/ja/
にある、S2Container 2.3.11 をダウンロードしてきました。
eclipseは、Version 3.2.0を使っています
Javaはjdk1.5.0_07を使ってます。
(ほかのバージョンでやったら、うまくいかないことがありました)
で、eclipseでImportしました。
File→Import→Existing Project into Workspace
(日本語だとファイル→インポート→既存プロジェクトをワークスペースへ)
でインポートしました。
以下のプログラムは、そのプロジェクトの直下に、デフォルトのパッケージ
(パッケージ指定なし)で作成したものです。
■ソースコード
●呼び出し側
SeasarTest.java
import org.seasar.framework.container.S2Container; import org.seasar.framework.container.factory.S2ContainerFactory; public class SeasarTest { public static void main(String[] args) { // アプリケーションコンテキストの取得 S2Container container = S2ContainerFactory.create("applicationContext.dicon"); // Beanの取得 Target target = (Target)container.getComponent("Target"); System.out.println( target.getMessage()); } } |
public interface Target { public String getMessage(); public void setMessage(String message); } |
public class TargetImpl implements Target { public TargetImpl() {} private String message; public String getMessage() { return this.message; } public void setMessage(String message) { this.message = message; } } |