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