2016-09-14 4 views
0

특정 주석이있는 필드를 캡처 할 수 있습니까? 내 최종 목표는 그 필드에 값을 삽입하는 것입니다,하지만 현재 내 포인트 컷은 틀린 것입니다 (올바른 구문이 확실하지 않습니다).Spring AOP 주석이 달린 필드의 Pointcut 표현

@Pointcut("execution(* *(..)) && @annotation(com.mycompany.MyAnnotation)") 
private void annotatedField(){} 

@Around("annotatedField()") 
public Object injectValue(final ProceedingJoinPoint proceedingJoinPoint) throws Throwable {} 

나는 포인트 컷이 주석 어떤 방법을 진술 믿습니다. 나는 그걸 바꾸어 필드를 말하고 싶다.

+2

당신이 _capture 어떤 field_ 무엇을 의미합니까? Spring (프록시 기반) AOP는 메소드 호출을 인터셉트하는 경우에만 작동합니다. –

+0

우수한 점. 그래서 아마도 내 방법론은 해당 필드의 setter 메소드에 pointcut을 가지고 있어야합니다. – Mostfoolish

+0

_inject_을 (를) 언급했습니다. 내장 된 autowiring 메커니즘을 사용하지 않는 이유는 무엇입니까? –

답변

0

당신은 의 조언을 따라야한다고 생각합니다. 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] 
관련 문제