-
클래스의 프록시백기선(인프런 강의)/더 자바, 코드를 조작하는 다양한 방법 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); } }
반응형'백기선(인프런 강의) > 더 자바, 코드를 조작하는 다양한 방법' 카테고리의 다른 글
ExceptionHandler (0) 2020.06.16 다이내믹 프록시 (0) 2020.06.16 리플렉션 정리 (0) 2020.06.14 리플렉션 API 1부: 클래스 정보 수정 또는 실행 (0) 2020.06.14 애노테이션과 리플랙션 (0) 2020.06.14