スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

SeasarでDI AOPを試みる

今はやりのDI Container(Dependancy Injection)とAOP。
EJBに代わる軽量コンテナとして期待されているので少し前に試してみた。
オープンソースとしては、SeasarとSpringが有名なところで、どちらがいいか迷ったが、Seasarの方が簡単そうで、国産でどこまでできているのか見るために、Seasarを試してみた。
『易しさ』と『優しさ』のキーワードはどうも消されてしまったようだ。

最初組み合わせを間違えて、

org.seasar.framework.exception.SAXRuntimeException: [ESSR0054]SAXで例外が発生しました。理由はjava.net.UnknownHostException: www.seasar.org

とネットのつながらない環境では、このエラーが出て??だったが、diconファイルにあるdtd宣言と使っていたseasarのバージョンのEntityResolverの食い違いにあって、バージョンを合わせることで落ち着いた。

あと、
Caused by: org.seasar.framework.container.factory.CircularIncludeRuntimeException: [ESSR0076]定義ファイル app.dicon が循環インクルードされました。経路は "app.dicon" includes "app.dicon"
こんな問題も出て、悪戦苦闘したが、インストールしなおしてeclipseを再起動すると直った。

あとstatic初期化子でコンテナの初期化を実行しようとしてこれまた問題がおきた。調べるのが面倒なので、fieldに直接書くようにした。

DIのコンセプトだが、オートバインディングというのは今ひとつ納得できない。そもそもインターフェースを使う目的は、実装クラスが複数あるからだと思うのだが、実装クラスが一つでないとバインディングできずにエラーになる、つまり実装クラスが一つであることを期待する、というのはどうも納得がいかない。
なので、自分はこれを使わずに、すべて具象クラスを指定することにした。オートバインディングや自動登録のメリットを享受できないが、この方が柔軟にできる。
例えば接続するRDBを切り替える場合、オートバインディングを使うなら、クラスパス内にインターフェースが一つになるように注意しないといけない。つまり切り替えるときにはそのクラスを排除しなければならないし、インターフェース - デフォルトクラス - サブクラスとしている場合には適用できない。

DIだけを使う場合はインターフェースはなくてもよいが、AOPを使う場合には必須になってくる。

AOPは便利だ。トランザクションとログ出力にしか使わなかったが、コードがかなりすっきりする。メソッドの終了時に、ただ単に終了したというログだけでなく、返り値を出力するようにできるので(返り値のオブジェクトにtoString()を実装しておく必要はあるが)、これも便利だ。

次はS2Hibernateについてレポート。

関連記事
スポンサーサイト

コメント

非公開コメント

プロフィール

dayan

Author:dayan
小職は、SE(システムエンジニア)を専門としておりますが、技術的な情報を中心に、それ以外に経済関連の日記、たわいもない日記も載せていきます。
[公式HPもよろしく!]

天気予報

-天気予報コム- -FC2-
リンク
ブロとも申請フォーム

この人とブロともになる

カテゴリー
最近の記事
ブログ内検索
最近のコメント
最近のトラックバック
RSSフィード
月別アーカイブ


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。