SlideShare ist ein Scribd-Unternehmen logo
1 von 19
Proxy & CGLIB

    최범균
Proxy



Client   Proxy   Real
Proxy Pattern
Object Communication
                   1: do()                               2: do()




   : Client                     : Proxy Service                    : Real Service




Real real = new Real()                  private Service real;
Proxy proxy = new Proxy();
proxy.setReal(real);                    public void do() {
                                          // before: doSomeThing
Client client = new Client();
client.setService(proxy);                   real.do();

                                            // after: doAnyThing
                                        }
Proxy 관련 API
• Java의 Dynamic Proxy



• CGLIB 이용
CBLIB
• Code Generation Library
  – 프록시 생성 기능 제공
  – 인터페이스 및 클래스에 대한 프록시 생성
  – http://cglib.sourceforge.net/


• 오픈 소스에서 프록시 생성 용도로 사용
  – Spring, Hibernate, iBATIS 등
CGLIB 설치
• 다운로드 사이트
 – http://sourceforge.net/project/showfiles.php?
   group_id=56933
• 배포판
 – cglib-nodep-2.2.jar : ASM 모듈 포함
 – cglib-2.2.jar : ASM 모듈 비 포함
CGLIB 주요 구성 요소
                                                             <<Interface>>
                                                          MethodInterceptor
                                                         +intercept() : Object



                                                             <<Interface>>
              Enhancer
                                                              LazyLoader
+setSuperclass(klass : Class)
                                                         +loadObject() : Object
+setCallback(callback : Callback)        <<Marker>>
+setCallbacks(callbacks : Callback [])   <<Interface>>
+create() : Object                         Callback          <<Interface>>
                                                               Dispatcher
                                                         +loadObject() : Object



            CallbackFilter                                  <<Interface>>
    +accept(method : Method) : int                               NoOp
                                                         +INSTANCE : NoOp
Enhancer를 이용한 프록시 생성
Enhancer enhancer = new Enhancer();

// 프록시 대상 지정
enhancer.setSuperclass(SomeService.class); public, pakcage, protected
                                             메서드가 대상
// 프록시에서 호출할 Callback
enhancer.setCallback(someCallback);

// 프록시 생성
Object proxy = enhancer.create();
               service.SomeService$$EnhancerByCGLIB$$91a42e4f

SomeService someService = (SomeService) proxy;
someService.create(quot;publicquot;); // proxy를 호출
프록시 대상 지정
• 클래스 지정
 enhancer.setSuperclass(RealService.class);


• 인터페이스 지정
 enhancer.setInterfaces(
      new Class<?>[] {Service.class});
주요 Callback
NoOp          아무 기능도 수행하지 않는 않음

MethodInterceptor 대상 객체의 메서드 호출 전/후로 자
                  유롭게 기능 추가가 가능
LazyLoader        대상 객체가 최초로 필요할 때 생성
                  해서 리턴
Dispatcher        각 메서드 호출에 알맞은 대상 객체
                  를 전달한다.
MethodInterceptor
• 대상 객체 호출 이전/이후에 필요한 기능
  삽입 가능한 Callback
 public interface MethodInterceptor extends Callback {
     public Object intercept(
            Object obj,   프록시 객체
            java.lang.reflect.Method method, 호출되는 메서드
            Object[] args, 호출 시 전달받은 인자
            MethodProxy proxy) 대상 객체 메서드를 호출할 때 사용
     throws Throwable;
 }
MethodInterceptor 구현
public class InterceptorImpl implements MethodInterceptor {

    @Override
    public Object intercept(Object obj, Method method,
      Object[] args, MethodProxy proxy) throws Throwable {

        System.out.println(quot;BEFOREquot;);

        Object result = proxy.invokeSuper(obj, args);
                                        Enhancer.setSuperclass()로
        System.out.println(quot;AFTERquot;);
                                        지정한 클래스의 메서드 호출

        return result;
    }

}
MethodInterceptor 샘플
public interface Service {    Enhancer enhancer = new Enhancer();
  public String say();
}                             enhancer.setSuperclass(RealService.class);
                              enhancer.setCallback(new InterceptorImpl());
public class RealService      Service service = (Service) enhancer.create();
      implements Service {
  @Override                   service.say();
                                               BEFORE
  public String say() {
      System.out.println(                      RealService 호출
         quot;RealService 호출quot;);                    AFTER
      return quot;안녕하세요quot;;
  }
}
MethodInterceptor 주의 사항
public class InterceptorImpl implements MethodInterceptor {

    @Override
    public Object intercept(Object obj, Method method,
      Object[] args, MethodProxy proxy) throws Throwable {
                                     프록시 객체의 메서드가 호출
        obj.toString();
                                                ↓
                                        Interceptor가 호출
        proxy.invoke(obj, args);                ↓
                                   반복 실행 후, StackOverflowError 발생
        return result;
    }

}
LazyLoader
• 최초 요청 시 실제 객체를 제공하기 위한
  용도로 사용
 public interface LazyLoader extends Callback {

     Object loadObject() throws Exception;

 }
LazyLoader 구현 예
package service;

import net.sf.cglib.proxy.LazyLoader;

public class LazyLoaderImpl implements LazyLoader {
  private Class<?> realClass;

    public LazyLoaderImpl(Class<?> realClass) {
      this.realClass = realClass;
    }

    @Override
    public Object loadObject() throws Exception {
      System.out.println(quot;실제 객체 생성quot;);
      return realClass.newInstance();
    }
}
실행 예
Enhancer enhancer = new Enhancer();
enhancer.setInterfaces(new Class<?>[] {Service.class});
enhancer.setCallback(new LazyLoaderImpl(RealService.class));


Service service = (Service) enhancer.create();

                 실제 객체 생성
service.say();   RealService 호출
service.say();   RealService 호출
활용
• Proxy 패턴
  – Lazy Instantication
  – 접근 제어


• Decorator 패턴
  – 메서드 기반 AOP 구현
    • before, after, around Advice 구현에 적용

Weitere ähnliche Inhalte

Was ist angesagt?

Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)Ontico
 
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговлеТененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговлеPlatonov Sergey
 
Александра Калинина "Trojan War: SinonJS"
Александра Калинина "Trojan War: SinonJS"Александра Калинина "Trojan War: SinonJS"
Александра Калинина "Trojan War: SinonJS"Fwdays
 
Jquery Introduction Hebrew
Jquery Introduction HebrewJquery Introduction Hebrew
Jquery Introduction HebrewAlex Ivy
 
Jak zabít několik much jednou ranou přechodem na fragmenty
Jak zabít několik much jednou ranou přechodem na fragmentyJak zabít několik much jednou ranou přechodem na fragmenty
Jak zabít několik much jednou ranou přechodem na fragmentyDavid Vávra
 
Testes unitários de JS com Jasmine e Karma
Testes unitários de JS com Jasmine e KarmaTestes unitários de JS com Jasmine e Karma
Testes unitários de JS com Jasmine e KarmaDouglas Matoso
 
Aller plus loin avec Doctrine2
Aller plus loin avec Doctrine2Aller plus loin avec Doctrine2
Aller plus loin avec Doctrine2André Tapia
 
Антон Полухин. C++17
Антон Полухин. C++17Антон Полухин. C++17
Антон Полухин. C++17Sergey Platonov
 
RxSwift 예제로 감잡기
RxSwift 예제로 감잡기RxSwift 예제로 감잡기
RxSwift 예제로 감잡기Yongha Yoo
 
from new class and dependency injection to PSR-11 and Auto-wiring
from new class and dependency injection to PSR-11 and Auto-wiringfrom new class and dependency injection to PSR-11 and Auto-wiring
from new class and dependency injection to PSR-11 and Auto-wiringMilad Arabi
 
2014 it - app dev series - 03 - interagire con il database
2014   it - app dev series - 03 - interagire con il database2014   it - app dev series - 03 - interagire con il database
2014 it - app dev series - 03 - interagire con il databaseMongoDB
 
Adi Fatol - Ce e nou in PHP 5.3?
Adi Fatol - Ce e nou in PHP 5.3?Adi Fatol - Ce e nou in PHP 5.3?
Adi Fatol - Ce e nou in PHP 5.3?phpGeekMeet_ro
 
KvZ Web Tasarım Hizmetleri
KvZ Web Tasarım HizmetleriKvZ Web Tasarım Hizmetleri
KvZ Web Tasarım HizmetleriAhmet Öztaş
 
HTTP Interceptors com AngularJS
HTTP Interceptors com AngularJSHTTP Interceptors com AngularJS
HTTP Interceptors com AngularJSRodrigo Branas
 
Ejb 3.0 Glassfish 2.X Netbeans 6.X
Ejb 3.0 Glassfish 2.X Netbeans 6.XEjb 3.0 Glassfish 2.X Netbeans 6.X
Ejb 3.0 Glassfish 2.X Netbeans 6.Xa19987225
 

Was ist angesagt? (19)

Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
 
Spring Boot 소개
Spring Boot 소개Spring Boot 소개
Spring Boot 소개
 
Testování prakticky
Testování praktickyTestování prakticky
Testování prakticky
 
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговлеТененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
 
Александра Калинина "Trojan War: SinonJS"
Александра Калинина "Trojan War: SinonJS"Александра Калинина "Trojan War: SinonJS"
Александра Калинина "Trojan War: SinonJS"
 
Oop koncepti
Oop konceptiOop koncepti
Oop koncepti
 
Jquery Introduction Hebrew
Jquery Introduction HebrewJquery Introduction Hebrew
Jquery Introduction Hebrew
 
Jak zabít několik much jednou ranou přechodem na fragmenty
Jak zabít několik much jednou ranou přechodem na fragmentyJak zabít několik much jednou ranou přechodem na fragmenty
Jak zabít několik much jednou ranou přechodem na fragmenty
 
Testes unitários de JS com Jasmine e Karma
Testes unitários de JS com Jasmine e KarmaTestes unitários de JS com Jasmine e Karma
Testes unitários de JS com Jasmine e Karma
 
Aller plus loin avec Doctrine2
Aller plus loin avec Doctrine2Aller plus loin avec Doctrine2
Aller plus loin avec Doctrine2
 
Антон Полухин. C++17
Антон Полухин. C++17Антон Полухин. C++17
Антон Полухин. C++17
 
RxSwift 예제로 감잡기
RxSwift 예제로 감잡기RxSwift 예제로 감잡기
RxSwift 예제로 감잡기
 
from new class and dependency injection to PSR-11 and Auto-wiring
from new class and dependency injection to PSR-11 and Auto-wiringfrom new class and dependency injection to PSR-11 and Auto-wiring
from new class and dependency injection to PSR-11 and Auto-wiring
 
2014 it - app dev series - 03 - interagire con il database
2014   it - app dev series - 03 - interagire con il database2014   it - app dev series - 03 - interagire con il database
2014 it - app dev series - 03 - interagire con il database
 
Adi Fatol - Ce e nou in PHP 5.3?
Adi Fatol - Ce e nou in PHP 5.3?Adi Fatol - Ce e nou in PHP 5.3?
Adi Fatol - Ce e nou in PHP 5.3?
 
KvZ Web Tasarım Hizmetleri
KvZ Web Tasarım HizmetleriKvZ Web Tasarım Hizmetleri
KvZ Web Tasarım Hizmetleri
 
Proyecto Final Android-SQLite
Proyecto Final Android-SQLiteProyecto Final Android-SQLite
Proyecto Final Android-SQLite
 
HTTP Interceptors com AngularJS
HTTP Interceptors com AngularJSHTTP Interceptors com AngularJS
HTTP Interceptors com AngularJS
 
Ejb 3.0 Glassfish 2.X Netbeans 6.X
Ejb 3.0 Glassfish 2.X Netbeans 6.XEjb 3.0 Glassfish 2.X Netbeans 6.X
Ejb 3.0 Glassfish 2.X Netbeans 6.X
 

Andere mochten auch

Proxy deep-dive java-one_20151027_001
Proxy deep-dive java-one_20151027_001Proxy deep-dive java-one_20151027_001
Proxy deep-dive java-one_20151027_001Sven Ruppert
 
Object relationship mapping and hibernate
Object relationship mapping and hibernateObject relationship mapping and hibernate
Object relationship mapping and hibernateJoe Jacob
 
Classloading and Type Visibility in OSGi
Classloading and Type Visibility in OSGiClassloading and Type Visibility in OSGi
Classloading and Type Visibility in OSGimartinlippert
 
Understanding Java Dynamic Proxies
Understanding Java Dynamic ProxiesUnderstanding Java Dynamic Proxies
Understanding Java Dynamic ProxiesOSOCO
 
AWS CloudFormation en 5 Minutos
AWS CloudFormation en 5 MinutosAWS CloudFormation en 5 Minutos
AWS CloudFormation en 5 MinutosOSOCO
 
Hibernate Presentation
Hibernate  PresentationHibernate  Presentation
Hibernate Presentationguest11106b
 

Andere mochten auch (9)

Proxy deep-dive java-one_20151027_001
Proxy deep-dive java-one_20151027_001Proxy deep-dive java-one_20151027_001
Proxy deep-dive java-one_20151027_001
 
Object relationship mapping and hibernate
Object relationship mapping and hibernateObject relationship mapping and hibernate
Object relationship mapping and hibernate
 
Dynamic Proxy by Java
Dynamic Proxy by JavaDynamic Proxy by Java
Dynamic Proxy by Java
 
Classloading and Type Visibility in OSGi
Classloading and Type Visibility in OSGiClassloading and Type Visibility in OSGi
Classloading and Type Visibility in OSGi
 
hibernate with JPA
hibernate with JPAhibernate with JPA
hibernate with JPA
 
Understanding Java Dynamic Proxies
Understanding Java Dynamic ProxiesUnderstanding Java Dynamic Proxies
Understanding Java Dynamic Proxies
 
AWS CloudFormation en 5 Minutos
AWS CloudFormation en 5 MinutosAWS CloudFormation en 5 Minutos
AWS CloudFormation en 5 Minutos
 
Hibernate in Action
Hibernate in ActionHibernate in Action
Hibernate in Action
 
Hibernate Presentation
Hibernate  PresentationHibernate  Presentation
Hibernate Presentation
 

Mehr von beom kyun choi

옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개beom kyun choi
 
DDD로 복잡함 다루기
DDD로 복잡함 다루기DDD로 복잡함 다루기
DDD로 복잡함 다루기beom kyun choi
 
TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나beom kyun choi
 
keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)beom kyun choi
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀beom kyun choi
 
Ddd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugDdd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugbeom kyun choi
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초beom kyun choi
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128beom kyun choi
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유beom kyun choi
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰beom kyun choi
 
ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료beom kyun choi
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)beom kyun choi
 
리뷰의 기술 소개
리뷰의 기술 소개리뷰의 기술 소개
리뷰의 기술 소개beom kyun choi
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해beom kyun choi
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개beom kyun choi
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개beom kyun choi
 
하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기beom kyun choi
 

Mehr von beom kyun choi (20)

옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
 
DDD로 복잡함 다루기
DDD로 복잡함 다루기DDD로 복잡함 다루기
DDD로 복잡함 다루기
 
TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나
 
keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)
 
DDD 준비 서문래
DDD 준비 서문래DDD 준비 서문래
DDD 준비 서문래
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀
 
Ddd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugDdd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksug
 
MVP 패턴 소개
MVP 패턴 소개MVP 패턴 소개
MVP 패턴 소개
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
 
ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
리뷰의 기술 소개
리뷰의 기술 소개리뷰의 기술 소개
리뷰의 기술 소개
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개
 
Zookeeper 소개
Zookeeper 소개Zookeeper 소개
Zookeeper 소개
 
하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기
 

Proxy & CGLIB

  • 1. Proxy & CGLIB 최범균
  • 2. Proxy Client Proxy Real
  • 4. Object Communication 1: do() 2: do() : Client : Proxy Service : Real Service Real real = new Real() private Service real; Proxy proxy = new Proxy(); proxy.setReal(real); public void do() { // before: doSomeThing Client client = new Client(); client.setService(proxy); real.do(); // after: doAnyThing }
  • 5. Proxy 관련 API • Java의 Dynamic Proxy • CGLIB 이용
  • 6. CBLIB • Code Generation Library – 프록시 생성 기능 제공 – 인터페이스 및 클래스에 대한 프록시 생성 – http://cglib.sourceforge.net/ • 오픈 소스에서 프록시 생성 용도로 사용 – Spring, Hibernate, iBATIS 등
  • 7. CGLIB 설치 • 다운로드 사이트 – http://sourceforge.net/project/showfiles.php? group_id=56933 • 배포판 – cglib-nodep-2.2.jar : ASM 모듈 포함 – cglib-2.2.jar : ASM 모듈 비 포함
  • 8. CGLIB 주요 구성 요소 <<Interface>> MethodInterceptor +intercept() : Object <<Interface>> Enhancer LazyLoader +setSuperclass(klass : Class) +loadObject() : Object +setCallback(callback : Callback) <<Marker>> +setCallbacks(callbacks : Callback []) <<Interface>> +create() : Object Callback <<Interface>> Dispatcher +loadObject() : Object CallbackFilter <<Interface>> +accept(method : Method) : int NoOp +INSTANCE : NoOp
  • 9. Enhancer를 이용한 프록시 생성 Enhancer enhancer = new Enhancer(); // 프록시 대상 지정 enhancer.setSuperclass(SomeService.class); public, pakcage, protected 메서드가 대상 // 프록시에서 호출할 Callback enhancer.setCallback(someCallback); // 프록시 생성 Object proxy = enhancer.create(); service.SomeService$$EnhancerByCGLIB$$91a42e4f SomeService someService = (SomeService) proxy; someService.create(quot;publicquot;); // proxy를 호출
  • 10. 프록시 대상 지정 • 클래스 지정 enhancer.setSuperclass(RealService.class); • 인터페이스 지정 enhancer.setInterfaces( new Class<?>[] {Service.class});
  • 11. 주요 Callback NoOp 아무 기능도 수행하지 않는 않음 MethodInterceptor 대상 객체의 메서드 호출 전/후로 자 유롭게 기능 추가가 가능 LazyLoader 대상 객체가 최초로 필요할 때 생성 해서 리턴 Dispatcher 각 메서드 호출에 알맞은 대상 객체 를 전달한다.
  • 12. MethodInterceptor • 대상 객체 호출 이전/이후에 필요한 기능 삽입 가능한 Callback public interface MethodInterceptor extends Callback { public Object intercept( Object obj, 프록시 객체 java.lang.reflect.Method method, 호출되는 메서드 Object[] args, 호출 시 전달받은 인자 MethodProxy proxy) 대상 객체 메서드를 호출할 때 사용 throws Throwable; }
  • 13. MethodInterceptor 구현 public class InterceptorImpl implements MethodInterceptor { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println(quot;BEFOREquot;); Object result = proxy.invokeSuper(obj, args); Enhancer.setSuperclass()로 System.out.println(quot;AFTERquot;); 지정한 클래스의 메서드 호출 return result; } }
  • 14. MethodInterceptor 샘플 public interface Service { Enhancer enhancer = new Enhancer(); public String say(); } enhancer.setSuperclass(RealService.class); enhancer.setCallback(new InterceptorImpl()); public class RealService Service service = (Service) enhancer.create(); implements Service { @Override service.say(); BEFORE public String say() { System.out.println( RealService 호출 quot;RealService 호출quot;); AFTER return quot;안녕하세요quot;; } }
  • 15. MethodInterceptor 주의 사항 public class InterceptorImpl implements MethodInterceptor { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { 프록시 객체의 메서드가 호출 obj.toString(); ↓ Interceptor가 호출 proxy.invoke(obj, args); ↓ 반복 실행 후, StackOverflowError 발생 return result; } }
  • 16. LazyLoader • 최초 요청 시 실제 객체를 제공하기 위한 용도로 사용 public interface LazyLoader extends Callback { Object loadObject() throws Exception; }
  • 17. LazyLoader 구현 예 package service; import net.sf.cglib.proxy.LazyLoader; public class LazyLoaderImpl implements LazyLoader { private Class<?> realClass; public LazyLoaderImpl(Class<?> realClass) { this.realClass = realClass; } @Override public Object loadObject() throws Exception { System.out.println(quot;실제 객체 생성quot;); return realClass.newInstance(); } }
  • 18. 실행 예 Enhancer enhancer = new Enhancer(); enhancer.setInterfaces(new Class<?>[] {Service.class}); enhancer.setCallback(new LazyLoaderImpl(RealService.class)); Service service = (Service) enhancer.create(); 실제 객체 생성 service.say(); RealService 호출 service.say(); RealService 호출
  • 19. 활용 • Proxy 패턴 – Lazy Instantication – 접근 제어 • Decorator 패턴 – 메서드 기반 AOP 구현 • before, after, around Advice 구현에 적용