티스토리 뷰

반응형
  • 인터페이스가 없는 경우 프록시는 어떻게 만드는지 알아보자.
    • 이 때는 라이브러리가 필요하다. (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인 경우
  • 결과적으로,
    • 인터페이스가 있을 때는 인터페이스의 프록시를 만들어서 사용하는 것이 효율적이다.
      • 인터페이스를 이용해서 프록시를 만드는 것이 훨씬 편하고, 상속에 관련된 제약사항도 없기 때문이다.
반응형

'Java > Java 기초' 카테고리의 다른 글

[Java 기초] Error와 Exception  (0) 2020.03.30
[Java 기초] 다이나믹 프록시 정리  (0) 2020.03.30
[Java 기초] static과 final의 조합  (2) 2020.03.19
[Java 기초] 데몬 스레드  (0) 2020.02.21
[Java 기초] static  (0) 2020.02.16
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함