0

Roo プロジェクトの最初の Aspect で、Web コントローラーの起動時にアドバイスを実行したいと考えています。しかし、ポイントカットを一致させることはできません。

コントローラーには、Cfx で始まるクラス名があります。私は次のフォームで試しました:

pointcut setBrand() : initialization(Cfx*.new (..));

before()  : setBrand()
{
    log.info("xxxxxxxxxxxx  setting brand");
}

「初期化」と同様に、(本 AspectJ Cookbook から) call(Signature) を新しいキーワード、preinitialization、staticinitialization で試しました。式は何ですか?

これは関連しているのかもしれません - Roo のアスペクトにはこのような形はありません - たとえば、ポイントカットはありません。彼らはどのように働いていますか?これはどこに文書化されていますか?

ありがとう

PS すみません、再投稿です。これを Spring Roo フォーラムに投稿しましたが、応答がありませんでした。http://forum.springsource.org/showthread.php?129374-Aspect-to-trap-Controller-creation-how-to

4

1 に答える 1

1

私は Roo や Spring についてほとんど何も知りませんが、AspectJ についてはいくつか知っています。そのため、あなたが AOP の初心者であると仮定して、AspectJ の観点からのみあなたの質問に答えるつもりです (私の仮定が正しくない場合は申し訳ありません)。

  • クラスがロードされたときに何かをしたい場合は、staticinitialization(TypePat)ポイントカットを使用してください。
  • オブジェクト(インスタンス)が作成されたときに何かをしたい場合は、 のようなものを使用しますexecution(ConstructorPat)initializationは特別な目的のためのものであり、preinitializationまれにしか必要とされません。あなたの正確な目的がわからないので、最初のもので十分だと思います。
  • さらに、次のようなものが基本的に必要なものであると仮定するとexecution(Cfx*.new (..))、「… で定義されたアドバイスが適用されていません [Xlint:adviceDidNotMatch]」のようなエラーまたは警告の可能性を確認することをお勧めします。使用する型パターンは、一致するコンストラクターがアスペクトと同じパッケージにあり、それらが標準の可視性 (パブリックなどではない) を持っていることを前提としていることに注意してください。したがって、クラスローディングの問題がない限り、一致させたいものをより正確に (またはより一般的に) 指定したいだけかもしれません。例:
    • com.bigboxco.my_app.Cfx*.new(..)
    • com.bigboxco..Cfx*.new(..)
    • public com.bigboxco..Cfx*.new(..)
    • !private com.bigboxco..Cfx*.new(..)
    • * com.bigboxco..Cfx*.new(..)

適切な戦略は、正確な署名を複製し、その完全修飾クラス名を使用して、コンストラクターの 1 つと一致させようとし、その時点から作業してより一般的なものにすることです。

更新: 自分で Web 検索を実行できることは知っていますが、いずれにせよ、ここにいくつかの便利なリンクがあります。

于 2012-08-20T06:28:15.163 に答える