足場:
申し訳ありませんが、私はすべて大文字のクラス名を好きではないと私のテンプレートが既にそれらを生成するので、私はまた、例として、私自身のパッケージ名を使用していました。
package de.scrum_master.app;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface Loggable {}
package de.scrum_master.app;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface Event {
String value();
}
ドライバアプリケーション:私は春のユーザーではないですので
これはピュアJavaです。ただそれが1つ以上の@Component
であると想像してください。
sendEmail()
は、@Event
によって注釈が付けられたメソッドから呼び出されないことに注意してください。これは、アノテートされたメソッドからの2つの呼び出しだけを、アスペクトを引き起こすべきではありません。
package de.scrum_master.app;
public class Application {
public static void main(String[] args) {
Application application = new Application();
application.doSomething();
application.paymentApproved();
application.taskComplete();
}
public void doSomething() {
sendEmail();
}
@Event("paymentApproved")
public void paymentApproved() {
sendEmail();
}
@Event("taskComplete")
public void taskComplete() {
sendEmail();
}
@Loggable
public void sendEmail() {}
}
アスペクト比:
あなたのポイントカットを表現したい:@Event
による注釈付きメソッドの制御フロー内@Loggable
でアノテートキャッチ方法。制御フローは、cflow()
またはcflowbelow()
ポイントカットで表すことができます。
package de.scrum_master.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import de.scrum_master.app.Event;
@Aspect
public class LogAspect {
@Before(
"@annotation(de.scrum_master.app.Loggable) &&" +
"execution(* *(..)) &&" + // only needed for AspectJ, not for Spring AOP
"cflow(@annotation(event))"
)
public void logEmail(JoinPoint thisJoinPoint, Event event) {
System.out.println(thisJoinPoint + " -> " + event);
}
}
コンソールログは:
execution(void de.scrum_master.app.Application.sendEmail()) -> @de.scrum_master.app.Event(value=paymentApproved)
execution(void de.scrum_master.app.Application.sendEmail()) -> @de.scrum_master.app.Event(value=taskComplete)
更新:あなたがフルにAspectJを使用していた場合(例えば、ロード時間織り経由)の代わりに春AOPのは、あなただけ使うことができましたa call()
pointcutそしてそこから、囲みジョインポイントの静的情報が得られます。その後、@Event
注釈は必要ではありませんでした。しかし、Spring AOPはちょうど "AOP lite"であり、call()
をサポートしていません。
これはOPの質問に対する答えではありません。彼は、 'sendEmail'が実行されている他のjoinpointからイベント注釈を取得したいとします。 – kriegaex
もしそれが間違っていると分からなければ、彼は 'sendEmail'と呼ばれるメソッドで同じアノテーションを使用しています。この注釈のポイントカットは – mlg
です。間違っていると分かりました。彼は 'sendEmail'にポイントカットをまだ残しておき、そこから呼び出し側の注釈にアクセスしたいと考えています。私は、呼び出し元メソッドへのpointcutの変更も間接的な方法で問題を解決することを知っていますが、電子メールメソッドを呼び出すことはありませんが、何か他のことをするイベント注釈をメソッドに注釈を付けるとどうなりますか?私の今後の解決策を見てください。 – kriegaex