당신은 의 조언을 따라야한다고 생각합니다. Sotirios Delimanolis 그리고 스프링 온보드 방법으로 최대한 멀리 가야합니다. 여전히 부적절하다고 생각하고 aspect를 사용하여 아이디어를 구현하고자한다면, Spring AOP 대신 AspectJ within Spring을 사용하고 get()
과 set()
과 같은 pointcut의 모든 힘을 활용하여 클래스 멤버에 대한 읽기/쓰기 작업을 가로 챌 수 있습니다. 정적 및 비 정적).
마커 주석 :
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는 메소드 호출을 인터셉트하는 경우에만 작동합니다. –
우수한 점. 그래서 아마도 내 방법론은 해당 필드의 setter 메소드에 pointcut을 가지고 있어야합니다. – Mostfoolish
_inject_을 (를) 언급했습니다. 내장 된 autowiring 메커니즘을 사용하지 않는 이유는 무엇입니까? –