출처: 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*(..)) && execution(public * get*(..))" />
<aop:pointcut id="somePointcut"
expression="execution(public !void get*(..)) and execution(public * get*(..))" />