카테고리 없음

[스프링 핵심 원리 고급편] 스프링 AOP - 포인트컷

PCD (Pointcut Designator)

 

종류

execution : 메소드 실행 조인 포인트를 매칭한다. 스프링 AOP에서 가장 많이 사용하고, 기능도 복잡하다.
within : 특정 타입 내의 조인 포인트를 매칭한다.
args : 인자가 주어진 타입의 인스턴스인 조인 포인트
this : 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트
target : Target 객체(스프링 AOP 프록시가 가르키는 실제 대상)를 대상으로 하는 조인 포인트 @target : 실행 객체의 클래스에 주어진 타입의 애노테이션이 있는 조인 포인트

@within : 주어진 애노테이션이 있는 타입 내 조인 포인트
@annotation : 메서드가 주어진 애노테이션을 가지고 있는 조인 포인트를 매칭
@args : 전달된 실제 인수의 런타임 타입이 주어진 타입의 애노테이션을 갖는 조인 포인트 bean : 스프링 전용 포인트컷 지시자, 빈의 이름으로 포인트컷을 지정한다.

 

execution vs within

execution: 상위타입 클래스 가능

within: 상위타입 클래스 불가

 

args vs execution

args: 동적으로 전달된 인수를 보고 판단, 상위타입 인수 허용

execution: 클래스 선언된 정보로 판단, 상위타입 인수 불가

 

 

단독 사용 불가 PCD

args, @args, @target

실행 시점에 어드바이스 여부를 판단함.

그 이전인 생성 단계에서는 판단이 불가하기에 모든 빈에 프록시를 생성하려 하기 때문

 

 

매개변수 전달

args(arg)의 형태로 매개변수를 파라미터로 받을 수 있다.

 

Type을 지정해서 매칭하는 경우, 매개변수가 해당 type이 아니면 매칭되지 않음

 

this: 매칭하는 객체 정보 (ex) MemberServiceImpl

target: 실제 객체 정보 (ex) MemberServiceImpl$$EnhancerBySpringCGLIB...

 

 

애노테이션 정보 가져옴

@annotation으로는 애노테이션에 설정해둔 value값도 가져올 수 있음.

 

 

this, target

정의

this : 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트
target : Target 객체(스프링 AOP 프록시가 가르키는 실제 대상)를 대상으로 하는 조인 포인트

 

주의 

this이면서 JDK 방식으로 프록시를 생성하면, JDK는 impl클래스에 대한 정보가 없기 때문에 프록시가 실행되지 않는다.

 

 

 

 

proxy 있을 때 빈으로 어떻게 등록되는거지?, proxy 빈 이름이 MemberService등의 찐이름 쓰는건지/

아니면 proxy, memberService 둘 다 등록되는건지? 그렇다면 이름은 어떻게 저장되는지?