스프링 CGLib 클래스 프록시 사용
스프링의 트랜잭션 AOP는 기본적으로 서비스 계층의 interface를 JDK 다이내믹 프록시 기술을 이용하여 AOP를 지원하지만 인터페이스가 없다면 CGLib를 이용하여 클래스 프록시를 생성한다.
만약 CGLib를 이용한 클래스 프록시를 사용한다면 클래스 패스의 라이브러리에 cglib-x.x.jar 가 있어야 한다.
주의 사항은 final 클래스에는 클래스 프록시를 적용할 수 없다는 것이다.
클래스 프록시는 타깃 클래스를 상속해서 프록시를 만들기 때문에 상속을 할 수 없는 final 클래스에는 적용하지 못한다.
또한, 클래스 프록시를 적용하면 클래스의 생성자가 두 번 호출된다.
첫 번째 생성자 호출 로그 (프록시 오브젝트)
create bean : com.kyu.svc.component.user.service.UserService$$EnhancerByCGLIB$$61c133f5
두 번째 생성자 호출 로그 (타깃 오브젝트)
create bean : com.kyu.svc.component.user.service.UserService
위의 로그는 UserService 클래스의 생성자에 남긴 것이며 WAS기동 시 찍힌다.
결국 위와 같이 프록시 객체를 생성함으로써 UserController에 정의된 userService 레퍼런스 변수는 UserService$$EnhancerByCGLIB$$61c133f5 이름을 가진 프록시 객체를 참조하게 되는 것이다.
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService; <- UserService$$EnhancerByCGLIB$$61c133f5
'프로그래밍' 카테고리의 다른 글
알고리즘 문제 풀이 방법에 대해서. (0) | 2013.03.08 |
---|---|
enum 으로 생성한 클래스 객체가 싱글톤인 이유? (0) | 2013.03.05 |
스프링 트래잭션 롤백이 되지 않을 때 확인 사항 (2) | 2013.03.05 |
스프링 interceptor afterCompletion 메소드 이용 시 참고할 사항 (0) | 2013.02.26 |
spring MVC 404 처리 방법? (3) | 2013.02.26 |
개방 폐쇄 원칙 OCP (Open-Closed Principle) (2) | 2013.02.26 |
singleton VS prototype 객체 성능 비교 (0) | 2013.02.21 |
리눅스에서 java main 실행 (0) | 2013.02.14 |