DIコンテナ その6 名前解決編
の続き。
前回Seasar2のサンプルコードを乗せましたが、名前解決について間違った認識をしていたので補足、修正します。Seasar2は文字列でのみ解決するということを書きましたが、そうではありませんでした。自動登録のところでオートネーミングしか説明がなかったので名前による解決しかないと勝手に思い込んでいたのです。
実際に名前がダブるような場合でも実装クラスが違えばクラスをキーにして問題はありませんし、逆に1つのインターフェースから複数の実装をした場合でも、コンポーネント名が違っていれば問題なく取得できるのを確認しました。
Seasar2がどういった方法でコンポーネントを登録するのか、その際に何をキーとして登録、取得や注入する判断はどこなのかなどといったところがマニュアルを見ても私の場合なかなか理解できなかったようです。
「EJB3.0 Simplified API」のような実際の使用方法を並べたものがマニュアルにも欲しかった気がします。そういやSeasar2はEJB3を実装します!と書いていましたけど、EJB3.1を実装する予定があるのかは気になるところですね。EJB3.0 Simplified APIはトランザクションも含めてもっとも気軽に扱えるSeasar2の形態ではないかと個人的に思っています。
また、注入箇所を明示するというのはSeasar2の考え方と相反するかもしれません(デフォルト動作がAUTOのため)。それでも設定によって動作を変えることが可能ですので私のような使い方をするのも問題はありません。
ただし、注意しなくてはいけないのは問題なくコンポーネントの取得が出来るからといって自動登録の際に「.*」とでもしてしまうと、コンクリートクラス以外が含まれてしまい動作に不具合がでてしまいます。あくまでも実装クラスかどうかを意識することは必要なようです。
とりあえずSeasar2は自動登録した際にデフォルトで名前とクラスを登録するのが分かりました。では他の3つのDIコンテナは名前による解決はどうなっているのか見てみましょう。
まず、EJB3。名前で解決できることは出来るのですが、名前は環境依存ということになっています。おかげで非常に扱いにくいです。EJB3.1では少なくともLocalインターフェースは名前が統一されることになりましたのである程度改善される見込みです。
続いてGuice。型を一番強く意識しているだけあってそもそも純粋に名前で解決は出来ません。あくまでもクラスとアノテーションです。文字列で扱いたい場合、アノテーションの属性としてStringをもって設定するという方法しかありません。したがってデフォルトで名前がつくということもありませんし、文字列そのものをキーとした取得は今後もできません。
最後にSpring Framework。Springも自動登録でデフォルトでコンポーネント名がつきます。クラス名の先頭を小文字にした名前です。これだけをみるとSeasar2とほぼ同様(ほぼというのは例えばImplを取り除くということはしないということです)に見えます。ですが、Seasar2は同一コンポーネント名が存在することを許すのに対してSpringは名前の重なりを許しません。
パッケージが別で同一のクラス名があった場合にコンポーネント名を定義していないとデフォルトの命名が重なってしまい、ApplicationContextの生成時(大概の場合コンストラクタ)に例外が発生します。Seasar2の場合は実行時に同一のコンポーネントがあった場合、登録時には例外発生せず、実行時に名前をキーにして取得しようと無茶をした場合に例外が発生しますのでこの違いを覚えておかないとはまるかもしれません。ただし、Seasar2の場合であっても依存性がある場合には即座にinitメソッドで例外が出ますのでコンポーネント名はやはり明示する、もしくはQualifiedAutoNamingを使用することを考えると良いでしょう。
コンテナ | コンポーネント名の自動登録 | コンポーネント名の重複を許す |
---|---|---|
EJB3 | △ | − |
Guice | × | − |
Spring | ○ | × |
Seasar2 | ○ | ○ |
上とは関係のないどうでもいいこと
Seasar2関連をしらべていると以下のページに不具合があるのを発見しました。どこに書けばよいのか分からなかったので、ここにおいときます。
具体的にはULタグが閉じていないのでHTMLのレンダリングが崩れます。
もうひとつは英語版のサイトですが、コンテナ等コアのプロダクトのダウンロードのリンクがことごとく404です。
http://s2container.seasar.org/2.4/en/index.html
リンク先が以下のようになっています。
http://s2container.seasar.org/2.4/download/2009-01-29/S2.4.34.zip
本来は以下のようになるのが正しいと思われます。「../」が足りていないようです。
http://s2container.seasar.org/download/2009-01-29/S2.4.34.zip
[追記]
2009/03/13時点で上記リンクは修正されました。
あと、英語版のサイトは2006年で更新が止まっていますので、せめて最新情報は日本語のページにありますとか、活動は今でも続いているけど、英語版だけ更新がとまってるんだよというのが欲しいような気がしました。最新の2006年のニュースが「Add Samples page.」となっていますが、その先にまっているのはリンク切れです…。