백기선(인프런 강의)/더 자바, 코드를 조작하는 다양한 방법
클래스의 프록시
레알윙
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);
}
}
반응형