4

自分の側面を定義するのに少し問題があります。get メソッドをプロファイリングしたいエンティティがたくさんあるので、次のポイントカットとメソッドを書きました。

@Pointcut("execution(* tld.myproject.data.entities.*.get*()")
public void getEntityProperty() {}

@Around("getEntityProperty()")
public Object profileGetEntityProperty(ProceedingJoinPoint pjp) throws Throwable {
    long start = System.currentTimeMillis();
    String name = pjp.getSignature().getName();
    Object output = pjp.proceed();
    long elapsedTime = System.currentTimeMillis() - start;
    if(elapsedTime > 100)
        System.err.println("profileGetEntityProperty: Entity method " + name + " execution time: " + elapsedTime + " ms.");
    return output;
}

構成でウィービングをオンにしましたが、ビジネスレイヤーに織り込む側面は問題なく機能します。私のポイントカットは正しく書かれていますか? それとも、それらを織り不可能にするエンティティについて何かがありますか? (私のエンティティには、クラス定義の前に @Entity というプレフィックスが付いています)

乾杯

ニック

4

3 に答える 3

6

あなたは実際には括弧だけです!

@Pointcut("execution(* tld.myproject.data.entities. .get () ) ")


Eclipse を使用している場合は、AspectJ コンパイル時ウィービングで開発することをお勧めします。最も簡単な方法です。

AJDT プラグインを使用すると、多くのヘルプが得られます! ポイントカットを貼り付けたところ、コンパイル エラーが発生しました。括弧を追加するとうまくいきました!

AJDT プラグインによるビジュアル サポートのスクリーンショット:

代替テキスト

getHello() メソッドの左側にあるオレンジ色の矢印は、それが around アドバイスによってアドバイスされていることを示しています。より大きな例については、こちらを参照してください。

于 2010-05-26T09:17:18.930 に答える
2

はいあります。エンティティは、newオペレーターを使用して作成されるため、Spring コンテキストの一部ではありません。

これを使用したい場合は、ウィービングを有効にし (私は を介し​​たロードタイムを好みます<context:load-time-weaver/>)、エンティティ クラスに で注釈を付ける必要があります@Configurable

私は、個人的には、この方法を好まないでしょう。残念ながら、それほど一般的な代替手段はありません。永続化プロバイダーが Hibernate の場合、エンティティのカスタム プロキシを作成できます -こちら を参照してください。ただし、これはさらに面倒です。

于 2010-05-26T07:27:34.560 に答える
0

@Configurable はコンパイル時のウィービングで機能することに注意してください。@Configurable を介してエンティティを自動配線することの欠点は、Hibernate を介してデータベースからエンティティを取得するときに、それらが機能していないように見えることです。はい、「新しい」呼び出しを介して。しかしつい最近、エンティティからの永続化を行うという非常に奇妙な要求が与えられた場合、「new」を使用した単体テストは完全に機能しましたが、休止状態 (または ehcache) のロードされたエンティティは、autowired プロパティの NPE をもたらしました。夜遅くでした。ですから、自分でテストをしたいと思うかもしれません.:) 私の最近の経験を伝えます. それが役に立てば幸い。

于 2010-06-18T20:26:10.560 に答える