티스토리 뷰
ProceedingJoinPoint
아래와 같이 @Around 애노테이션을 붙인 공통 기능으로 사용할 메소드의 파라미터로 ProceedingJoinPoint 인터페이스를 받는다.
@Around("publicTarget()")
public Object measure(ProceedingJoinPoint joinPoint) throws Throwable
{
이 파라미터로 전달 받은 ProceedingJoinPoint에 호출되는 대상 객체에 대한 정보, 실행되는 메소드의 정보 등이 담겨있다.
예를들어 다음과 같이 실행해서 공통 기능도 실행 됐을때
long fiveFact = cal.factorial(5);
파라미터로 전달한 정수 5도 ProceedingJoinPoint에 담겨있다.
ProceedingJoinPoint 인터페이스에는 다음과 같은 메소드들이 있다.
Signature getSignature() : 호출되는 메소드에 대한 정보를 구함
Object getTarget() : 대상 객체를 구함
Object[] getArgs() : 파라미터 목록 구함
(자바에서는 메소드 이름과 파라미터를 합쳐서 메소드의 시그니쳐라고 한다)
프록시 생성 방식
스프링은 런타임에 프록시 객체를 만들때 핵심 기능을 실행하는 대상 객체가 인터페이스를 상속하면 인터페이스를 이용해 프록시를 생성한다.
즉 이전 RecCalculator 예제에서 (https://tose33.tistory.com/737), RecCalculator 클래스는 Calculator 인터페이스를 상속 하기 때문에 만들어지는 프록시 객체는 Calculator 인터페이스를 상속받는 형태로 만들어진다.
Calculator
/ \
$Proxy RecCalculator
따라서 프록시 객체는 RecCalculator와는 관련이 없어지기 때문에 getBean 메소드로 Calculator 타입이 아닌 RecCalculator 타입을 받도록 한다면 익셉션이 발생한다.
이렇게 대상 객체가 인터페이스를 상속할때, 인터페이스가 아닌 클래스를 이용해서 프록시를 생성하고 싶다면 @EnableAspectjAutoProxy 애노테이션의 proxyTargetClass 속성을 참으로 해주면 된다.
@EnableAspectJAutoProxy(proxyTargetClass = true)
출처 : 스프링5 프로그래밍 입문 (최범균 저)
'Web' 카테고리의 다른 글
Ch8. DB, 스프링이 제공하는 JdbcTemplate Class (0) | 2022.07.07 |
---|---|
Ch07. Advice 적용 순서, @Order, @Around의 Pointcut 설정 (0) | 2022.06.28 |
Ch07. 스프링 AOP (0) | 2022.06.27 |
Ch07. AOP 프로그래밍 용어, Around Advice (0) | 2022.06.27 |
Ch07. AOP 프로그래밍이란 (0) | 2022.06.25 |
- Total
- Today
- Yesterday
- Python
- Tree
- graph
- Spring
- greedy
- floyd warshall
- Stack
- two pointer
- dfs
- db
- Unity
- 조합
- 이분탐색
- priority queue
- BFS
- back tracking
- recursion
- 재귀
- permutation
- Brute Force
- C
- Dijkstra
- 자료구조
- C++
- DP
- Implementation
- binary search
- MVC
- CSS
- Kruskal
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |