2012-04-08 15 views
2
public abstract class AService<T> { 
    public T needsToBeAdvised(T param) { 
    T result = doSomething(param); 
    return result; 
    } 
} 

@Service 
public class BService extends AService<B> { 
    @Override 
    public T needsToBeAdvised(T param) { 
    return super.needsToBeAdvised(param); 
    } 
} 

@Service 
public class CService extends AService<C> {} 

// (B & C implement an interface AType) 

@Component 
@Aspect 
public class MyAspect { 
    @Pointcut("execution(* package.AService+.needsToBeAdvised(*))") 
    private void aNeedToBeAdvised() {} 

    @AfterReturning(pointcut="aNeedToBeAdvised()", returning="param") 
    public void interceptNeedsToBeAdvised(JoinPoint joinPoint, AType param) { 
    // some action 
    } 
} 

をオーバーライドしていませんか?春AOPスーパークラスのメソッドをアドバイスし、この設定を考えると、サブクラスで

EDIT:

私はBServiceCServiceの両方が同じパッケージ内にあることを追加する必要があります。

私は次のように私のポイントカットを変更する場合:私はCService

答えて

1

に同じパッケージ内にあるすべてのサービスをneedsTobeAdvised()を上書きしている場合は、それが動作

@Pointcut("execution(* package.CService.needsToBeAdvised(*))") 

cService.needsToBeAdvised(cParam) //is still not intercepted 

唯一の方法はありますか?あなたのサンプルコードからわかるように、私はpackageパッケージにはAServiceBServiceがあると思われますが、CServiceは別のパッケージにあると考えられます。彼らは同じパッケージに、あなたが、例えば、より汎用的であることをポイントカット

  • 変更されるように

    • 移動:サービスは確かに異なるパッケージに含まれている場合は、いくつかのオプションを持っています
    • "execution(* *.A+.needsToBeAdvised(*))はあなたの応答のためのより多くのポイントカット
  • +0

    に感謝を追加します。彼らは同じパッケージに入っています。上記の編集を参照してください。 – mantithetical

    関連する問題