본문 바로가기
Spring

[Spring] pointcut 표현식 2

by Real Iron 2019. 2. 13.

출처: https://groovysunday.tistory.com/204?category=312452 [성냥의 불친절한 IT 이야기]

@ execution 명시자

- Advice를 적용할 메서드 지정


- 기본 형식 :

-> "*" 는 모든 값을 의미

-> ".." 는 0개 이상 의미



 execution([수식어] [리턴타입] [클래스이름] [이름]([파라미터])


 수식어

 - 생략가능

 - public, protected 등등

 리턴타입

 - 메서드의 리턴타입 지정

 클래스이름, 이름

 - 클래스의 이름 및 메서드의 이름 지정

 파라미터

 - 메서드 파라미터 지정




ex)


execution(* some.package.*.*())

- some.package 패키지 내

- 파라미터가 없는 모든 메서드 호출


execution(* some.package..*.*(..))

- some.package 패키지와 하위 패키지에 있는

- 파라미터가 0개 이상인 모든 메서드 호출


execution(String some.package.SomeService.someMethod(..))

- 리턴 타입이 String,

- some.package.SomeService 인터페이스 내

- 파라미터가 0개 이상인 someMethod 메서드 호출


execution(* some*(*))

- 메서드 이름이 some으로 시작되고,

- 파라미터가 1개인 메서드 호출


execution(* some*(*, *))

- 메서드 이름이 some으로 시작되고,

- 파라미터가 2개인 메서드 호출


execution(* some*(String, ..))

- 메서드 이름이 some으로 시작되고,

- 첫번째 파라미터 타입이 String,

- 파라미터가 1개 이상인 메서드 호출




@ within 명시자 

- 특정 타입(Interface, Class)에 속하는 메서드를 Pointcut으로 지정


ex)


within(some.package.SomeService)

- SomeService 인터페이스 내 모든 메서드 호출


within(some.package.*)

- some.package 패키지 내 모든 메서드 호출


within(some.package..*)

- some.package 패키지 및 하위 패키지 내 모든 메서드 호출




@ bean 명시자

- Spring 2.5부터 제공

- 스프링 빈 이름을 이용하여 Pointcut 지정

- 빈 이름의 패턴을 설정


ex)


bean(someServiceBean)

- 이름이 someServiceBean인 빈의 메서드 호출


bean(*SomeService)

- 이름이 SomeService로 끝나는 빈의 메서드 호출




@ &&(and), ||(or)


- 표현식에는 '&&' 및 '||' 연산자를 이용

-> 각각의 표현식을 연결

-> and 연산과 or 연산

-> and면 양쪽 표현식을 모두 만족하는

-> or이면 양쪽 표현식중 어느 하나를 만족하는


ex)

@Before("execution(public !void get*(..)) || execution(public !void set*(..))")

public void someBeforeAdviceMethod(JoinPoint joinPoint){

    // 대상 객체 메서드 실행전 수행할 공통기능

}

 

@After("execution(public !void get*(..)) && execution(public * get*(..))")

public void someAfterAdviceMethod(JoinPoint joinPoint){

    // 대상 객체 메서드 실행후 수행할 공통기능

}


- XML 스키마에서 Aspect를 설정할 경우

-> '&&', '||' 사용가능 ('&&' 식으로)

-> 'and', 'or'로 사용가능

<aop:pointcut id="somePointcut"

       expression="execution(public !void get*(..)) &amp;&amp; execution(public * get*(..))" />

 

<aop:pointcut id="somePointcut"

       expression="execution(public !void get*(..)) and execution(public * get*(..))" />