goo blog サービス終了のお知らせ 

ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

DIのフレームワーク、SpringとSeasar2をHelloWorldで比較してみた

2006-08-18 16:21:15 | 開発ネタ

 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());
	}

}
(コメントがすこしおかしい(Bean?)ですが、これは、Springのサンプルと比較するためです) ●部品(コンポーネント) Target.java(インターフェース) 
public interface Target
{
	   public String getMessage();
	   public void setMessage(String message);
}
(上記の < > ¥は本当は半角です) TargetImpl.java(インターフェース) 
public class TargetImpl implements Target
{
	   public TargetImpl() {}

	   private String message;
	   public String getMessage() { return this.message; }
	   public void setMessage(String message) { this.message = message; }
}
(上記の < > ¥は本当は半角です) ●設定ファイル applicationContext.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="Target" class="TargetImpl">
		<property name="message">"Hello World!"</property>
	</component>
</components>
(上記の < > ¥は本当は半角です)
■比較 以下のような感じでしょうかね。。
報告終わり(^^!)
この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 「電子政府“無責任”の連鎖を... | トップ | 「声優の声で着信ボイスを自... »
最新の画像もっと見る

開発ネタ」カテゴリの最新記事

2025年9月
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

ブログランキング

アクセス状況

アクセスアクセス
閲覧 847 PV DOWN!
訪問者 509 IP DOWN!
トータルトータル
閲覧 35,154,269 PV 
訪問者 8,837,083 IP 
ランキングランキング
日別 929 DOWN!
週別 483 UP!

プロフィール

自己紹介
ろくでもない人です。

最新コメント

バックナンバー

ブックマーク

goo
最初はgoo
  • RSS2.0