Kijumuna をお使いの皆様へ
とある現象が環境によって発生したりしなかったりしているようなので,皆さんの環境でどうなるかご確認頂けないでしょうか?
次の dicon ファイルなんですが...
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN" "http://www.seasar.org/dtd/components21.dtd"> <components> <component class="java.lang.CharSequence"> "hoge" </component> </components>
私の環境 (Windows XP・J2SE1.4.2_08・Eclipse 3.0.2・Kijimuna 0.6.23) だと <component>
要素でエラーと警告が一つずつ表示されます (デフォルトの設定).
- [component] インターフェイスjava.lang.CharSequenceをコンポーネント化するにはアスペクトが必要です
- [component] 式言語とclass属性の両方が記述されています
しかし,Kijumuna コミッタの id:r-matuda さんのところではエラーにならないそうな.
皆さんの環境ではいかがでしょうか?
08:30 追記
ごうぎさんが詳しくレポートしてくださってます.
http://www.wingnest.com/blog/?itemid=330
09:45 追記
CVS にコミットされている修正で解決したようです.
休み明けの週刊 Kijimuna アップデートでリリースされることでしょう.
お騒がせしました.
instance=outer
# wizardp 『(中略) outerで登録しなきゃいけないのもちょっと微妙ですしね。』
outer ってそんなに微妙かなぁ?
S2Xxx の多くは既存のフレームワーク等と S2 とを連携させるためのものですが,その手のフレームワークって定義情報に従ってアプリケーションコンポーネントをインスタンス化したりするのがよくある話.
そしてそのフレームワークなんかが S2 と連携しやすいかどうかは,コンポーネントのインスタンス生成部分をカスタマイズできるかどうかにかかっています.フレームワークがインスタンスを new
するかわりに S2 コンテナから取ってくることが簡単にできればハッピー.インスタンスを生成するというのは典型的なホットスポットなので (デザパタにもあるわけで),そこをカスタマイズすることができるというのは重要です.
同じことは S2 にもいえます.S2 自身も定義されたコンポーネントのインスタンスを生成するのが主要な役割だったりするわけですが,S2 自身が new
するしかないってことだと辛いこともありそうです.
そんなわけで (どんなわけで?),instance="outer"
が用意されています.たぶん.経緯は知らないけど.
こいつを使用する時はコンテナから getComponent()
するのではなく,injectDependency()
します.微妙なイメージを持たれてしまうのはこのメソッドの名前が getComponent()
と全然違うからでしょうか?
でもでも,実はそんなに違いはありません.
例えば instance="prototype"
の場合,S2 は
- コンポーネントのインスタンスを
new
する (コンストラクタ・インジェクション). - プロパティを設定する (セッター・インジェクション).
- 初期化メソッドを実行する (メソッド・インジェクション).
ということをしますが,instance="outer"
の場合は injectDependency()
の引数で渡されたオブジェクトに対して
- プロパティを設定する (セッター・インジェクション).
- 初期化メソッドを実行する (メソッド・インジェクション).
するだけです.違うのはインスタンスの生成をしないからコンストラクタ・インジェクションできないことくらい (10:00 追記 ランタイムに作成したサブクラスからインスタンス化することで実現している AOP も使えませんね).
実際,org.seasar.framework.container.deployer
パッケージにある PrototypeComponentDeployer
クラスと OuterComponentDeployer
を見比べてみれば,やってることに大差ないことが分かります.と書いておきながら,実はその詳細を分かっていないのは内緒だ.
ともあれ (JW),instance="outer"
はそんなに微妙ってことはないと思います.
register()
を使うのはさすがに微妙な気がしますけど.こっちは極力コンテナの初期化以外では避けたい気分です.個人的には.
出演予定 TV 番組
情報なしですぅ...