2016-11-22 25 views
0

本質的に動的なポイントカット式を作成したいと思います。 私は3つのパッケージ持っている - 任意の時点でaspectj/springの動的ポイントカット式Aop

private static final String PACKAGE = System.getProperty("packagePrefix"); 

@Around("execution(* "+PACKAGE+"..*.*(..)) && execution(* ..common.*(..))") 
以下のような

何かを パッケージ1、 パッケージ2、 共通

共通は常にinculdedと、システムプロパティに基づくべきである私は、パッケージ1 ORパッケージ2をロードしたいの

これをどのように達成できますか?

EDIT:

私は非常に興味深いですthisを発見したと私は私の要件を解決すると思いますが、それは を動作させることができないので、このリンクは、以下の

@Aspect 
public abstract class MyAspect { 

protected abstract pointcut(); 


@Before("pointcut()") 
public void myAdviceMethod() { 
// Advice code goes here 
} 
} 


public class ConcreteAspect extends MyAspect { 

@Pointcut("execution(* com.acme.*.*(..))") 
    protected pointcut() { 
) 
} 

のように持っていると言いますJavaの設定で以下に含まれています

@Bean 
public ConcreteAspect myAspect() { 
    return new ConcreteAspect(); 
} 

OWエラー:

java.lang.IllegalArgumentExceptionが::: 0でエラーが、私はそれゆえオーバーライドされたポイントカットの方法を見つけるために、そのことはできません実行時に推測し、参照 ポイントカットポイントカット

を見つけることができませんpointcutを解決できません。 これをどのように修正できますか?

答えて

0

あなたは(特定のパッケージ

@Pointcutをスキャンしますどの、内で使用できる "内(..common ..(..)") ます。public void CommonPackage(){}

@Pointcut( "内(..PACKAGE ..(..)") ます。public void specificPackage(){}

、Uはあなたの状況 @Aroundために必要とする前に、または任意の助言/ @アラウンド@を使用して( "実行(CommonPackage()& & SpecificPackage() ") 異なるパッケージのポイントカット式を記述し、それらを一緒にバインドします。お役に立てれば!

+0

お返事ありがとうございました。しかし、このパッケージは2番目のポイントカットにどのように置かれますか? PACKAGEはシステムプロパティーから実行時に値を取得する文字列であることを覚えておいてください。 – SCoder

1

次のようなチェックにする場合は()句を使用することができます。私は似た何かが注釈スタイルの構文のために働くだろうと思い

aspect X { 
    before(): execution(* Code.*(..)) && 
    if(isOfInterest(thisJoinPointStaticPart.getSignature().getDeclaringType())) { 
    System.out.println("advice running"); 
    } 

    public static boolean isOfInterest(Class s) { 
    return s.getPackage().toString().startsWith(packagePrefix); 
    } 
} 

を。しかし、このアプローチでは、一致するすべてのジョインポイントで実行時テストが行​​われます。

+0

Response.ButのAndyさんに感謝します。アドバイスを有効にする - アドバイスを無効にする必要がある場合のみ使用できます。だから、私の場合は、package1用とpackage2用の2つのアドバイスを作成する必要があります。だから私は50のパッケージを持っている場合、私は50のアドバイスを作成する必要があります。私が本当に望むのは、実行時に式の中のパッケージ名を置き換えることです。 – SCoder

+0

'isOfInterest'メソッドの実装を適切なロジックで置き換えることができますが、あなたがアドバイスするすべてのジョインポイントでブールメソッドを評価するために支払う費用は非常に小さいことに注意してください。あなたのアドバイスされたコードが何度も呼び出されなかったり、パフォーマンスに重大ではない場合、それは問題ではありません。 –

+0

@NándorElődFekete - booleanを返すことができるので、isOfInterestにロジックを入れることはできません。ドキュメントから - if(...)ボディは任意の有効なJavaブール式になります。ジョインポイントはthisJoinPoint、thisJoinPointStaticPartおよびthisJoinPointEnclosingStaticPartを形成します。 – SCoder

関連する問題