S2Daoに任せるメソッドと実装メソッドの共存
interface HogeDao { Hoge findByFooId(String fooId); Hoge findByBarId(String barId); }
のようなインタフェースに対して、findByFooId()はS2Daoに任せたいがfindByBarId()は実装を書きたいという場合、どうするのがいいんでしょうか。
class HogeDaoImpl implements HogeDao { @Aspect("dao.interceptor") Hoge findByFooId(String fooId) { return null; // ---[A] } Hoge findByBarId(String barId) { // .... return hoge; } }
という実装クラスを書いて見たところ、findByFooId()のところにAOPがかからず[A]の実装部分が実行されてしまいます。
S2Daoのインタセプタに任せた場合にメソッド実装は無視してくれるとこの構成でいけると思うんですが、S2DaoのAOP処理は今のところインタフェースのメソッド宣言か抽象メソッドでだけうまくいくようになっているみたいです。
で、代替策として考えたのが、
interface HogeDao { @Aspect("dao.interceptor") Hoge findByFooId(String fooId); @Aspect("myInterceptor") Hoge findByBarId(String barId); } class MyInterceptor implements MethodInterceptor { public Object invoke(MethodInvocation invocation) throws Throwable { // データアクセス処理 return 結果; } }
というように実装を指定したいメソッドには自前のインタセプタをしかける方法。
他にいい方法があればどなたか教えてくださいー。
自己解決
ソースを見たら、実装メソッドの場合はそのメソッド自身をinvokeしてるんですね。
@Aspect("dao.interceptor") abstract class HogeDaoImpl implements HogeDao { //Hoge findByFooId(String fooId); // interfaceでの宣言のみ→S2Dao対象 Hoge findByBarId(String barId) { // 実装アリ→実装したコードが実行される // .... return hoge; } }
単にこれでよかったわけですね。
抽象クラスのメソッドでも実行できると。すごいなぁ。