개발일기장

CGLIB proxy ... 본문

JAVA

CGLIB proxy ...

게슬 2023. 11. 26. 15:35
728x90

일반 java proxy 말고

CGLIB에서 제공하는 proxy사용법

1. MethodInterceptor를 구현

methodProxy 객체가 있는것 말고는 여기까지는 비슷함

그리고 method.invoke보다 저게 더 빠르다고 하는데 몰루겠슴.

@Slf4j
public class TimeMethodInterceptor implements MethodInterceptor {

   private final Object target;

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

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

        Object result = methodProxy.invoke(target, args); // <- 이게 좀 더 빠르대요..
        //Object result = method.invoke(target, args);

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

        return result;
    }
}

 


2. Enhancer로 호출

이거는 Interface가 아닌 객체를 직접 사용함

그래서 Enhancer에 class / callback을 등록해주고 Proxy를 생성해서 호출하면 끝남.

    void cglib(){
        // interface가 없는 놈.
        ConcreteService target = new ConcreteService();


        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(ConcreteService.class); // 구체 class 상속 받아서 생성 할 수 있음
        enhancer.setCallback(new TimeMethodInterceptor(target)); // method interceptor 넣어줌
        ConcreteService proxy = (ConcreteService) enhancer.create(); //proxy 만들기

        log.info("targetClass={}", target.getClass());
        log.info("proxyClass={}", proxy.getClass());

        proxy.call();
    }

 

근대 이거랑 java proxy랑 뭐가 다른지 몰루겠슴.

728x90
Comments