読者です 読者をやめる 読者になる 読者になる

え、インターフェイス噛まさないとaspectされないの?

S2(Seasar2)でむっちゃはまったのでメモ。
今のプロジェクトではserviceを自動登録して、InterceptorChainでaspect適応させて、
トランザクションなどをやっているんですが、どうもうまくaspectされてないサービスがある。
おかしいな……なんだこりゃ、と思って調べてみたら。

S2って、コンテナにclass(Impl)を登録してinjectionされても、methodに対して全くaspectがきかないのですね……。
インターフェイスいらないサービスがあったので、実装のみを登録していたのですが、
軒並みそれらが全滅。

これはひょっとして、当たり前の動きなのでしょうか?
interface置くの当たり前だろ? みたいな。
2.3系、2.4系ともに駄目なのでこれ仕様なのかしら。

でも、errorもwarningもでないんじゃわからないですよー。(traceInterceptorログは消してましたすみません)
最小構成でやってやっと判明。

<components>
    <include path="aop.dicon"/>
    <component name="hogeService" class="test.HogeService">
        <aspect>aop.traceInterceptor</aspect>
    </component>
    <component name="fooService" class="test.FooServiceImpl">
        <aspect>aop.traceInterceptor</aspect>
    </component>
    <component name="containerTest" class="test.ContainerTest">
        <aspect>aop.traceInterceptor</aspect>
    </component>
</components>

とした場合、
HogeServiceは実装(class)。
FooServiceImplも実装(class)。

ContainerTestには、HogeService(class)、FooService(interface)がメンバとして定義してある。
で、無事インジェクション。
でもHogeServiceだけ全くaspectされてねー!!!!!

Seasar2……せめて何か異常を吐いてください……。
それとも何かdiconに設定を書けば良いのかしらん。
お前が無知で馬鹿なだけです、というツッコミがあれば歓迎。