AOP PointCut 표현식
- -
PointCut 표현식을 정리
포인트컷에는 다양한 명시자를 이용할 수 있습니다.
execution | Advice를 적용할 메서드를 명시할 때 사용합니다. |
within | 특정 타입에 속하는 메서드를 JoinPoint로 설정되도록 명시할 때 사용합니다. |
bean | 스프링 버전 2.5 버전부터 지원하기 시작했으며, 스프링 빈을 이용하여 JoinPoint를 설정합니다. |
execution 명시자
execution([수식어] 리턴타입 [클래스이름].이름(파라미터)
- 수식어 : public, private 등 수식어를 명시합니다. (생략 가능)
- 리턴타입 : 리턴 타입을 명시합니다.
- 클래스이름 및 이름 : 클래스이름과 메서드 이름을 명시합니다. (클래스 이름은 풀 패키지명으로 명시해야합니다. 생략도 가능)
- 파라미터 : 메서드의 파라미터를 명시합니다.
- " * " : 모든 값을 표현합니다.
- " .. " : 0개 이상을 의미합니다.
Ex)
execution(public Integer com.edu.aop.*.*(*))
- com.edu.aop 패키지에 속해있고, 파라미터가 1개인 모든 메서드
execution(* com.edu..*.get*(..))
- com.edu 패키지 및 하위 패키지에 속해있고, 이름이 get으로 시작하는 파라미터가 0개 이상인 모든 메서드
execution(* com.edu.aop..*Service.*(..))
- com.edu.aop 패키지 및 하위 패키지에 속해있고, 이름이 Service르 끝나는 인터페이스의 파라미터가 0개 이상인 모든 메서드
execution(* com.edu.aop.BoardService.*(..))
- com.edu.aop.BoardService 인터페이스에 속한 파마리터가 0개 이상인 모든 메서드
execution(* some*(*, *))
- 메서드 이름이 some으로 시작하고 파라미터가 2개인 모든 메서드
within 명시자
Ex)
within(com.edu.aop.SomeService)
- com.edu.aop.SomeService 인터페이스의 모든 메서드
within(com.edu.aop.*)
- com.edu.aop 패키지의 모든 메서드
within(com.edu.aop..*)
- com.edu.aop 패키지 및 하위 패키지의 모든 메서드
bean 명시자
Ex)
bean(someBean)
- 이름이 someBean인 빈의 모든 메서드
bean(some*)
- 빈의 이름이 some으로 시작하는 빈의 모든 메서드
스프링 AOP 구현 - execution 명시자 표현식
Aspect를 적용할 위치를 지정할 때 Pointcut 설정에서 execution 명시자를 사용했었다.
execution 명시자는 Advice를 적용할 메서드를 지정할 때 사용된다.
execution(수식어패턴? 리턴타입패턴 클래스이름패턴?메서드이름패턴(파라미터패턴) ☞ execution( [public|protected|private] [return type] [className][메소드명](파라미터) ) ex) @Pointcut("execution(public * chap07..*(..))") |
수식어 패턴 - 생략 가능한 부분. public, protected 등이 온다. 스프링 AOP에서는 public 메서드에만 적용 가능하단다.
리턴 타입 패턴- 말그대로 리턴 타입을 명시. 앞에 포스팅했었던 execution에서는 이 자리에 '*' 을 명시했었다.
클래스 이름 패턴? 메서드 이름 패턴 - 클래스 이름클래스 이름 및 메서드 이름을 패턴으로 명시함. 클래스 이름 대신 패키 지명이
올 수도 있음
파라미터 패턴- 매칭 될 파라미터에 대해 명시함.
'*'을 이용해서 모든 값을 표현할 수 있다.
'..'을 이용해서 0개 이상이라는 의미를 표현할 수 있다.
Examples.
execution( public void set*(..) )
수식어 패턴 : public
리턴 타입 : void
클래스 이름 : 생략됨
메서드 이름 : setter (set으로 시작하는 메서드)
파라미터 패턴 : 파라미터가 0개 이상 '(..)'
execution( * chap07.*.*() )
수식어 패턴 : 생략됨
리턴 타입 : * ← 전부
클래스 이름 : chap07.* ← chap07 패키지에 있는 모든 클래스. chap07 하위 패키지까지는 아님. (chap07 : 패키지명.)
메서드 이름 : * ← 전부
파라미터 패턴 : 공란 ← 없음
execution( * chap07..*.*(..) )
수식어 패턴 : 생략됨
리턴 타입 : * ← 전부
클래스 이름 : chap07..* ← chap07 패키지 및 해당 패키지 하위의 모든 클래스 (chap07 : 패키지명.)
메서드 이름 : * ← 전부
파라미터 패턴 : (..) ← 0개 이상
execution( Long chap07.Calculator.factorial(..) )
수식어 패턴 : 생략됨
리턴 타입 : Long
클래스 이름 : chap07.Calculator
메서드 이름 : factorial
파라미터 패턴 : (..) ← 0개 이상
execution( * get*(*) )
수식어 패턴 : 생략됨
리턴 타입 : * ← 전부
클래스 이름 : 생략됨
메서드 이름 : getter (get으로 시작하는 메서드)
파라미터 패턴 : * ← 1개
execution( * get*(*, *) )
수식어 패턴 : 생략됨
리턴 타입 : * ← 전부
클래스 이름 : 생략됨
메서드 이름 : getter (get으로 시작하는 메서드)
파라미터 패턴 : *, * ← 2개
execution( * read*(Integer,..) )
수식어 패턴 : 생략됨
리턴 타입 : * ← 전부
클래스 이름 : 생략됨
메서드 이름 : read로 시작하는 모든 메서드
파라미터 패턴 : Integer, .. ← 1개 이상의 파라미터를 가짐. 첫 번째 파라미터형은 Integer형이어야 함
여러 가지 상황에 대해서 설정을 해보았다.
expression="execution(void com.study.spring.beans.TestBean2.method1())"
-> 매개변수에 아무것도 설정되어 있지 않기 때문에 매개변수가 없는 void형의 method1 메서드에만 포인트 컷이 적용된다.
expression="execution(void com.study.spring.beans.TestBean2.method1(int))"
-> 매개변수에 int 한 개가 들어가 있다. 같은 이름의 메서드 method1이 매개 변수만 다르게 여러 개가 있으면 그중에서 매개변수를 int로 받는 advice만 적용된다.
expression="execution(void com.study.spring.beans.TestBean2.method1(int, int))"
-> 매개변수에 int 두 개가 들어가 있다. 매개변수의 개수까지 철저하게 지키기 때문에 위에처럼 int 한개만 받는 advice는 적용이 안되고 두개가 들어가 있어야 적용된다.
expression="execution(void com.study.spring.beans.TestBean2.method1(*))"
-> *는 모든 타입을 받지만 개수는 한 개! 예를 들어 매개변수가 java.lang.String (String은 자바에서 클래스이기 때문에 이렇게 입력해주어야 한다.) 이면 적용이 되지만 int, double 이렇게 두 개면 적용이 안된다.
expression="execution(void com.study.spring.beans.TestBean2.method1(..))"
->.. 는 타입, 개수 상관없이 모든 매개변수를 받는다. method1이라는 메서드에 매개변수의 타입이 여러 형태이고 개수가 여러 개여도 상관이 없다.
expression="execution(void com.study.spring.beans.TestBean2.*(..))"
-> 메서드 부분이 *처리가 되어 있다. com.study.spring.beans.TestBean2 라는 클래스에 있는 모든 메서드에 어떤 매개변수가 들어가도 다 적용할 수 있다는 뜻이 되겠다.
expression="execution(void *.*(..))"
-> 클래스 부분까지 *처리가 되어 있다. 반환형이 void인 모든 패키지의 모든 클래스의 모든 메서드에 어떤 매개변수가 들어가도 다 적용을 할 수 있다는 뜻이다.
expression="execution(* *.*(..))" / expression="execution(* *(..))"
-> 반환 타입까지 *처리가 되어 있다. 모든 반환 타입, 모든 패키지, 모든 클래스, 모든 메서드, 모든 매개변수에 다 적용된다. 클래스는 *이면 생략할 수 있기 때문에 후자의 형태로 적어도 상관이 없다.
// @Pointcut("execution(public void get*(..))") // public void인 모든 get메소드
// @Pointcut("execution(* com.javalec.ex.*.*())") // com.javalec.ex 패키지에 파라미터가 없는 모든 메소드
// @Pointcut("execution(* com.javalec.ex..*.*())") // com.javalec.ex 패키지 & com.javalec.ex 하위 패키지에 파라미터가 없는 모든 메소드
// @Pointcut("execution(* com.javalec.ex.Worker.*())") // com.javalec.ex.Worker 안의 모든 메소드
// @Pointcut("within(com.javalec.ex.*)") //com.javalec.ex 패키지 안에 있는 모든 메소드
// @Pointcut("within(com.javalec.ex..*)") //com.javalec.ex 패키지 및 하위 패키지 안에 있는 모든 메소드
// @Pointcut("within(com.javalec.ex.Worker)") //com.javalec.ex.Worker 모든 메소드
// @Pointcut("bean(student)") //student 빈에만 적용
// @Pointcut("bean(*ker)") //~ker로 끝나는 빈에만 적용
'개인공부 > SPRING' 카테고리의 다른 글
MyBatis 설정 (0) | 2022.10.10 |
---|---|
[Spring JDBC] JdbcTemplate (0) | 2022.10.10 |
[Spring] 스프링 AOP (Spring AOP)란? (2) | 2022.10.09 |
객체 자동주입할 떄 해당하는 빈 객체가 없을 시 예외가아닌 null값으로 대체하는 방법(@Nullable) (0) | 2022.10.09 |
@Qualifier 애노테이션 (1) | 2022.10.08 |
소중한 공감 감사합니다