Target의 기능을 수행하면서 기능을 확장하거나 추가된 실제 객체를 의미합니다.
Spring은 AOP기능을 Proxy 기반으로 제공하고 있습니다.
JDK Dynamic Proxy와 CGLIB을 활용하여 AOP를 제공하고 있습니다.
Object proxy = Proxy.newProxyInstance(
ClassLoader,
Class<?>[],
InvocationHandler
);
구체적인 class type을 몰라도 그 class의 method, type, variables에 접근할 수 있는 기능
동적으로 class를 load하고, heap에 객체를 생성하는 절차가 있어 성능 이슈가 있는듯?!
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Target.class);
enhancer.setCallback(MethodInterceptor);
Object proxy = enchancer.create(); // proxy 생성
Enhander 의존성 추가
, default 생성자 필요
, target의 생성자 2번 호출
의 단점으로 인해 Spring에서는 CGLIB를 권장하지 않음.
Spring 3.2버전부터 Spring Core 패키지에 cglib가 포함
되었고,
4버전에는 Objensis의 도움으로 default 생성자 없이 proxy 생성
할 수 있고,
생성자가 2번 호출되는 단점도 개선
되었다고 합니다.
cglib의 한계들이 개선되어 Spring에서는 성능이 좋은 CGLIB로 Proxy를 생성하게 되었다고 합니다.