본문 바로가기

Study

Cglib dynamic proxy

원래는 서드파티였으나 지금은 스프링이 기본으로 사용하는 방식

 

바이트코드를 조작는 방식이며 구체클래스 기반으로 동작한다.

 

jdk dynamic proxy와 다르게 인터페이스가 필요하지 않으나

 

상속을 통해서 사용하다보니 class에 final이 붙은것은 프록시처리를 하면 예외가 발생한다

 

메소드도 마찬가지

 

그 외에 특이점은 인자에 들어있는 Method.invoke를 사용하기보단 MethodProxy를 통한 하용을 추천한다는 점

(성능상 이점이 있다고 한다.)

 

import lombok.extern.slf4j.Slf4j;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

@Slf4j
public class TimeMethodInterceptor implements MethodInterceptor {

    private final Object target;

    public TimeMethodInterceptor(Object target) {
        this.target = target;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        log.info("TimeProxy 실행");
        long startTime = System.currentTimeMillis();

        Object result = methodProxy.invoke(target, objects);

        long endTime = System.currentTimeMillis();
        long resultTime = endTime - startTime;
        log.info("TimeProxy 종료 resultTime={}", resultTime);
        return result;
    }
}

'Study' 카테고리의 다른 글

포인트컷, 어드바이스, 어드바이저  (0) 2022.10.06
Proxy Factory  (0) 2022.10.05
JDK Dynamic Proxy  (0) 2022.09.30
인터페이스 기반 vs 구체 클래스 기반 프록시  (0) 2022.09.29
프록시 패턴 & 데코레이터 패턴  (0) 2022.09.22