私はSotirios Delimanolisのアドバイスに従い、Springオンボード手段でできるだけ取得する必要があると思います。それでもあなたがまだ不十分であり、あなたのアイデアを実装するために側面を絶対に使いたいと思えば、Spring AOPの代わりにAspectJ within Springを使用して、get()
とset()
のようなポイントカットの全機能を利用して、クラスメンバの読み込み/静的および非静的の両方)。例えば:
マーカー注釈:
package de.scrum_master.app;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyAnnotation {}
ドライバアプリケーション:
アプリケーションが(toString()
)を読み出し、それらの間で注釈を付け、(コンストラクタ、メイン方法)すべてのフィールドを書き込むstatus
フィールド。
package de.scrum_master.app;
public class Application {
private int id;
private String name;
@MyAnnotation private String status;
public Application(int id, String name, String status) {
this.id = id;
this.name = name;
this.status = status;
}
@Override
public String toString() {
return "Application [id=" + id + ", name=" + name + ", status=" + status + "]";
}
public static void main(String[] args) {
Application application = new Application(11, "AspectJ demo", "starting");
System.out.println(application);
application.id = 22;
application.name = "AspectJ field access demo";
application.status = "running";
System.out.println(application);
application.status = "shutting down";
System.out.println(application);
application.status = "stopped";
System.out.println(application);
}
}
アスペクト比:
package de.scrum_master.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class AnnotatedFieldAspect {
@Before("get(* *) && @annotation(de.scrum_master.app.MyAnnotation)")
public void interceptRead(JoinPoint thisJoinPoint) {
System.out.println(thisJoinPoint);
}
@Before("set(* *) && @annotation(de.scrum_master.app.MyAnnotation) && args(newValue)")
public void interceptWrite(JoinPoint thisJoinPoint, Object newValue) {
System.out.println(thisJoinPoint + " -> " + newValue);
}
}
コンソールログ:
set(String de.scrum_master.app.Application.status) -> starting
get(String de.scrum_master.app.Application.status)
Application [id=11, name=AspectJ demo, status=starting]
set(String de.scrum_master.app.Application.status) -> running
get(String de.scrum_master.app.Application.status)
Application [id=22, name=AspectJ field access demo, status=running]
set(String de.scrum_master.app.Application.status) -> shutting down
get(String de.scrum_master.app.Application.status)
Application [id=22, name=AspectJ field access demo, status=shutting down]
set(String de.scrum_master.app.Application.status) -> stopped
get(String de.scrum_master.app.Application.status)
Application [id=22, name=AspectJ field access demo, status=stopped]
あなたが_captureことにより、任意のfield_何を意味するのですか? Spring(プロキシベース)AOPは、メソッド呼び出しをインターセプトするだけで動作します。 –
優れた点。だから、おそらく私の方法論は、そのフィールドのセッターメソッド上のポイントカットを持っている必要がありますか? – Mostfoolish
あなたは_inject_を挙げました。組み込みのautowiringメカニズムを使用してみませんか? –