복붙노트

[SPRING] 주석이있는 클래스의 주석이 달린 메소드 또는 메소드에 대한 Pointcut

SPRING

주석이있는 클래스의 주석이 달린 메소드 또는 메소드에 대한 Pointcut

@X로 주석 된 클래스 나 @X로 주석이 붙은 메소드에서 pointcut이 필요합니다. 나는 또한 주석 객체가 필요하다. 클래스와 메소드 모두에 주석이 달린 경우 메소드 주석을 인수로 사용하는 것을 선호합니다.

나는 "일관성없는 바인딩"경고를 만드는 다음을 시도했다. (왜 그냥 null로 설정하지 않습니까?)

@Around("@annotation(methodLevelX) || @within(classLevelX)")
public Object advise(ProceedingJoinPoint pjp, X methodLevelX, X classLevelX)

다음은 '||'에 걸쳐 매개 변수 x의 모호한 바인딩을 만듭니다. in pointcut "경고를 표시합니다. (내 의견으로는 반드시 이해가되지 않습니다 : 첫 단락 평가를 구속하지 않는 이유는 무엇입니까?)

@Around("@annotation(x) || @within(x)")
public Object advise(ProceedingJoinPoint pjp, X x)

클래스와 메소드 주석이있는 경우 이전 시도를 두 개로 자연스럽게 분할하면 두 개의 메소드 호출이 발생합니다.

난 그냥 반사 및 내 원하는 주석을 pointcut이 같은 메서드 및 클래스를 얻을 수 있습니다.

@Around("@annotation(com.package.X) || @within(com.package.X)")

그러나 나는하지 않을 것을 원합니다.

어떤 "하나의 pointcut, 하나의 메소드, 하나의 annotation argument", 리플렉션을 요구하지 않는 나의 요구 사항을위한 솔루션이 있습니까?

해결법

  1. ==============================

    1.별로는 아니지만 거의. 두 개의 pointcut, 두 개의 조언이 필요하지만 작업을 단일 메소드에 위임 할 수 있습니다. 방법은 다음과 같습니다.

    별로는 아니지만 거의. 두 개의 pointcut, 두 개의 조언이 필요하지만 작업을 단일 메소드에 위임 할 수 있습니다. 방법은 다음과 같습니다.

    @Aspect
    public class AnyAspectName {
    
        @Pointcut("execution(@X * *.*(..))")
        void annotatedMethod() {}
    
        @Pointcut("execution(* (@X *).*(..))")
        void methodOfAnnotatedClass() {}
    
        @Around("annotatedMethod() && @annotation(methodLevelX)")
        public Object adviseAnnotatedMethods(ProceedingJoinPoint pjp, X methodLevelX) 
                throws Throwable {
            return aroundImplementation(pjp, methodLevelX);
        }
    
        @Around("methodOfAnnotatedClass() && !annotatedMethod() && @within(classLevelX)")
        public Object adviseMethodsOfAnnotatedClass(ProceedingJoinPoint pjp, X classLevelX) 
                throws Throwable {
            return aroundImplementation(pjp, classLevelX);
        }
    
        public Object aroundImplementation(ProceedingJoinPoint pjp, X annotation) 
                throws Throwable {
            return pjp.proceed();
        }
    
    }
    

    @annotation ()과 @within () pointcuts를 분리하는 것 이외에, 결과적인 pointcut이 너무 넓지 않도록 제한을 추가했습니다. 메소드 실행 join point를 원한다고 가정하기 때문에 메소드 실행에 제약을주는 pointcut 표현식을 추가했습니다. 그들은 일치하고있다.

    @within (X)와 @annotation (X)을 더 제한하는 것은 편리합니다. 왜냐하면 @within (X) 자체가 일치하기 때문입니다

    메서드 호출, 생성자 실행, 생성자 호출, 사전 초기화, 정적 초기화, 초기화, 필드 집합, 필드 가져 오기, 예외 처리기, 잠금 유형 조인 포인트 (모든 조인 포인트가 유효한 것은 아닙니다. 주위에 조언). 마찬가지로, @ 주석 (X) 자체는

    이는 주석의 대상 유형에 따라 앞서 언급 한 대부분의 조인 포인트를 의미 할 수도 있습니다.

  2. from https://stackoverflow.com/questions/36175368/pointcut-for-annotated-methods-or-methods-in-annotated-classes by cc-by-sa and MIT license