ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 클래스의 프록시
    백기선(인프런 강의)/더 자바, 코드를 조작하는 다양한 방법 2020. 6. 16. 20:19
    반응형

    자바에서는 다이내믹 프록시를 인터페이스로 만들어야 하지만 서브 클래스를 만들 수 있는 라이브러리를 사용하여 프록시를 만들 수 있다. 

     

     

    CGlib

    • https://github.com/cglib/cglib/wiki
    • 스프링, 하이버네이트가 사용하는 라이브러리
    • 버전 호환성이 좋치 않아서 서로 다른 라이브러리 내부에 내장된 형태로 제공되기도 한다.

     

    예제

    pom.xml 추가

        <dependency>
        	<groupId>cglib</groupId>
        	<artifactId>cglib</artifactId>
        	<version>3.3.0</version>
        </dependency>

     

    public class Book {
    	String title = "clean code";
    
    	public String getTitle() {
    		return title;
    	}
    
    	public void setTitle(String title) {
    		this.title = title;
    	}
    }

     

    public class BookService {
    	void rent(Book book) {
    		System.out.println("전 ");
    		System.out.println("rent : " + book.getTitle());
    		System.out.println("이후 ");
    	}
    
    	void returnBook(Book book) {
    		System.out.println("여기는 returnBook : " + book.getTitle());
    	}
    }

     

    import java.lang.reflect.Method;
    
    import org.junit.jupiter.api.Test;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class BookServiceTest {
    
    	MethodInterceptor handler = new MethodInterceptor() {
    		BookService bookService = new BookService();
    
    		@Override
    		public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
    			return method.invoke(bookService, objects);
    		}
    	};
    
    	BookService bookService = (BookService) Enhancer.create(BookService.class, handler);
    
    	@Test
    	public void di() {
    		Book book = new Book();
    		book.setTitle("spring");
    		bookService.rent(book);
    		bookService.returnBook(book);
    	}
    }
    반응형
Designed by Tistory.