새소식

인기 검색어

개인공부/SPRING

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로 끝나는 빈에만 적용

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.