1

メソッドの最後で、つまり、関数コントロールがアノテーションを使用して呼び出し元に戻ったときに(例外または通常の戻りのために)アクションを実行することは可能ですか?

例:

@DoTaskAtMethodReturn
public void foo() {
.
.
. 
Method foo Tasks  
.
.
.

return;  -------->  Background task done by annotation hook here before returning to caller.
}
4

3 に答える 3

1

あなたの質問はSpring-Annotationsでタグ付けされているため、明らかにSpringを使用しています。Spring で必要なことを行うには、いくつかの手順があります。

構成でAspectJ/AOP-Supportを有効にします。

<aop:aspectj-autoproxy/>

pointcutを使用する Aspect (Spring AOP と AspectJ を参照) を記述します@After@annotation

@Aspect
public class TaskDoer {

  @After("@annotation(doTaskAnnotation)")
  // or @AfterReturning or @AfterThrowing
  public void doSomething(DoTaskAtMethodReturn doTaskAnnotation) throws Throwable {
    // do what you want to do
    // if you want access to the source, then add a 
    // parameter ProceedingJoinPoint as the first parameter
  }
}

次の制限事項に注意してください。

  • AspectJ コンパイル時のウィービングを有効にするか、javaagent パラメーターを使用しない限り、foo を含むオブジェクトは Spring 経由で作成する必要があります。つまり、アプリケーション コンテキストから取得する必要があります。
  • 追加の依存関係がなければ、インターフェイスを介して宣言されたメソッドにのみアスペクトを適用できます。つまり、foo() はインターフェイスの一部である必要があります。依存関係として cglib を使用すると、インターフェイスを介して公開されていないメソッドにアスペクトを適用することもできます。
于 2013-02-11T21:45:38.070 に答える
0

はい、ただし注釈だけではありません。

独自の注釈プロセッサを作成し、コード インジェクションを使用する必要があります。

Java注釈プロセッサの書き方は?

Java バイトコード インジェクションとは

Java バイトコード インジェクション

于 2013-02-11T21:16:44.600 に答える
0

短い答えは「はい、可能です」です。これは、アスペクト指向プログラミング (AOP) と呼ばれるものの一部です。アノテーションベースの AOP の一般的な用途は、すべてのデータベース アクティビティをトランザクションにラップする@Transactionalです。

これをどのように行うかは、構築しているもの、使用しているフレームワーク (存在する場合) などによって異なります。Spring を依存性注入に使用している場合は、このSO の回答に良い例があるか、Spring ドキュメントをチェックアウトできます。 . 別のオプションは、簡単な AOPを可能にする Guice (私の好み) を使用することです。

于 2013-02-11T21:22:00.513 に答える