Java/Java 기초

[Java 기초] 클래스의 프록시

메성 2020. 3. 30. 01:09
반응형
  • 인터페이스가 없는 경우 프록시는 어떻게 만드는지 알아보자.
    • 이 때는 라이브러리가 필요하다. (CGlib)

 

CGlib

<dependency>
  <groupId>cglib</groupId>
  <artifactId>cglib</artifactId>
  <version>3.3.0</version>
</dependency>
@Test
public void di() {
  MethodInterceptor handler = new MethodInterceptor() {
    MyBookService myBookService = new MyBookService();
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
      if(method.getName().equals("rent")) {
        System.out.println("aaaa");
        Object invoke = method.invoke(myBookService, objects);
        System.out.println("bbbb");
        return invoke;
      }
      return method.invoke(myBookService, objects);

    }
  };

  MyBookService myBookService = (MyBookService) Enhancer.create(MyBookService.class, handler);

  Book book = new Book();
  book.setTitle("spring");
  myBookService.rent(book);
  myBookService.returnBook(book);
}
  • 여기에서 중요한 것은 cglib의 Enhancer.create(MyBookService.class, handler);는 MyBookService를 상속해서 만드는 것을 볼 수 있다.

 

서브 클래스를 만드는 방법의 단점

  • 상속을 사용하지 못하는 경우에는 프록시를 만들 수가 없다.
    • private 생성자만 있는 경우
    • final class인 경우
  • 결과적으로,
    • 인터페이스가 있을 때는 인터페이스의 프록시를 만들어서 사용하는 것이 효율적이다.
      • 인터페이스를 이용해서 프록시를 만드는 것이 훨씬 편하고, 상속에 관련된 제약사항도 없기 때문이다.
반응형