레알윙 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);
	}
}
반응형