え、インターフェイス噛まさないと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に設定を書けば良いのかしらん。
お前が無知で馬鹿なだけです、というツッコミがあれば歓迎。