[Seasar-user:16308] Re: [s2-container] あるテストのときだけMockInterceptorを使ったMockに置き換えたいとき

Mitsutaka Sato [E-MAIL ADDRESS DELETED]
2008年 11月 17日 (月) 13:19:18 JST


小林様
いつもお世話になっております。

はい、logic.diconのほうはname属性はつけていません。
mock.diconのほうにname属性をつけてやってみたのですが、
logic.diconに用意したほうがセットされてしまいました。

下記の例でいう、HogeServiceとHogeLogicは両方とも logic.dicon に
登録されている形です。

「名前があるほうが優先される」ということですが、

class HogeService {
  @resource
  private HogeLogic hogeLogic;
}

の場合、「hogeLogic」(クラス名をdecapitalizeしたもの)
という名前でコンポーネントを探し、
無ければ、 HogeLogicをインターフェースに持つ
コンポーネントを探すという理解でよろしいでしょうか?

また、例では上記のように書きましたが、
実際にはアノテーションではなくsetterインジェクション
なのですが、それによる違いはありますでしょうか?

もし、同じ名前でcomponentを登録してしまった場合は
どのようになるのでしょうか?

以上よろしくお願いいたします。


2008/11/13 Koichi Kobayashi <[E-MAIL ADDRESS DELETED]>

> 小林 (koichik) です.
>
> Date:    Thu, 13 Nov 2008 21:01:45 +0900
> From:    "Mitsutaka Sato" <[E-MAIL ADDRESS DELETED]>
> To:      seasar-user <[E-MAIL ADDRESS DELETED]>
> Subject: [Seasar-user:16296] [s2-container]
> あるテストのときだけMockInterceptorを使ったMockに置き換えたいとき
>
> > HogeServiceのテストケースで、hogeLogicをMockInterceptorを使ったMockに置き換えたいとき、
> > どのようにすればよいでしょうか?
> >
> > HogeLogicはlogic.diconに
> >     <component
> >         class="com.hoge.impl.HogeLogicImpl"
> >         instance="prototype">
> >         <aspect>j2ee.requiredTx</aspect>
> >     </component>
> > のように定義されていて、
> >
> > mock.dicon に
> >     <component name="mockInterceptor"
> >
> > class="org.seasar.framework.aop.interceptors.MockInterceptor">
> >         <initMethod name="setReturnValue">
> >             <arg>"getCenterSeq"</arg>
> >             <arg>"9998000001"</arg>
> >         </initMethod>
> >     </component>
> >     <component
> >         class="com.hoge.HogeLogic"
> >         instance="prototype">
> >         <aspect>mockInterceptor</aspect>
> >     </component>
> > と書いて、
> >
> > app.diconでは
> > mock.diconとlogic.diconをincludeしました。
> > 順番を入れ替えてみても、実態(HogeLogicImpl)のほうがセットされてしまいます。
>
> 実際には logic.dicon の定義だけコンポーネント名が
> 指定されていないでしょうか?
>
> もしそうなら,mock.dicon でもコンポーネント名を
> 指定してください.
>
>    <component
>        name="hogeLogic"
>         class="com.hoge.HogeLogic"
>        instance="prototype">
>
> Seasar2.4 では最初にコンポーネントを名前で検索します.
> そのため,片方だけ名前が指定されていると,常にそちらが
> DI されます.
>
> > logic.diconをincludeしなければいいだけの話なんですが、他にもたくさん登録されているので。
> > 横着できる方法はないかと。
> >
> > 同じインターフェースを持つComponentの場合、優先される順位とかあるんでしょうか?
>
> あります.
> app.dicon が foo.dicon と bar.dicon をこの順で
> インクルードし,foo.dicon が baz.dicon を
> インクルードしている場合,
>
> app.dicon
>  foo.dicon
>    baz.dicon
>  bar.dicon
>
> app.dicon に定義されているコンポーネントからは,
> 上記の順番で優先的に見えます.
> つまり,
>
> ・app.dicon がもっとも優先
> ・foo.dicon は bar.dicon や baz.dicon より優先
> ・baz.dicon は bar.dicon より優先
>
> となります.
> こちらの図も参考にしてください.
>
>
> http://s2container.seasar.org/2.4/s2-framework/ja/apidocs/org/seasar/framework/container/S2Container.html
>
>
> --
> <component name="koichik">
>    <property name="fullName">"Koichi Kobayashi"</property>
>    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
>    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
> </component>
>
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://ml.seasar.org/archives/seasar-user/attachments/20081117/61f15114/attachment-0001.html>


Seasar-user メーリングリストの案内