개발일기장
CGLIB proxy ... 본문
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
'JAVA' 카테고리의 다른 글
SQLSessionManager.newInstance()에서 어떤 순서로 Connection을 가지고 오고 반환하는가. (1) | 2024.09.16 |
---|---|
Connection 을 왜 더 이상 끌어오지 못하는 걸까 (GenericObjectPool) (1) | 2024.09.16 |
Proxy ... (1) | 2023.11.26 |
Reflection ... (0) | 2023.11.26 |
Java 데이터 접근 기술 - transaction & exception(Check,UnCheck) (3) (0) | 2023.02.08 |
Comments