SSISO Community

시소당

<aop:scoped-proxy /> 작동 방식

<aop:scoped-proxy /> 요소는 이전 글(링크) 에서 소개했는데
이번엔 좀 더 자세히 작동 방식에 대해 정리해 보겠습니다.
아래 설정을 보시면 bar가 참조하는 foo의 scope는 session 입니다.
  1. <bean id="foo" class="jjaeko.Foo" scope="session">  
  2.    <aop:scoped-proxy/>  
  3. </bean>  
  4.      
  5. <bean id="bar" class="jjaeko.Bar" autowire="byName" />  

이 설정을 기반으로 한 WebApplicationContext 컨테이너는 foo를 생성할 때
<aop:scoped-proxy /> 요소가 있으므로 foo에 대한 Proxy 객체를 생성 합니다.
Foo(Proxy)객체에 적용된 intercept는 다음과 같습니다.(CGLIB 사용 할 경우)
Cglib2AopProxy$DynamicAdvisedInterceptor
Cglib2AopProxy$DynamicUnadvisedInterceptor
Cglib2AopProxy$SerializableNoOp
Cglib2AopProxy$SerializableNoOp
Cglib2AopProxy$AdvisedDispatcher
Cglib2AopProxy$EqualsInterceptor
Cglib2AopProxy$HashCodeInterceptor

여기서 중요한 것은
DynamicUnadvisedInterceptor 입니다.
DynamicUnadvisedInterceptor 가 적용 되는 메소드는 Object 클래스의 toString(), clone(), finalize() 메소드와 사용자정의 public 메소드(non-static) 입니다.

DynamicUnadvisedInterceptor의 intercept 구현 내용은 크게 2단계로 나뉩니다.
첫번째로 getTarget() 호출 두번째로 원본 메소드 호출이 되겠습니다.
getTarget() 메소드는 최종적으로 AbstractBeanFactory 의 getBean() 메소드를 호출 합니다. 따라서 해당 bean에 정의된 scope가 현재scope(session, request) 에 의해 새로운 객체를 생성하거나 기존의 객체를 돌려 줍니다. 그리고는 돌려 받은 target객체를 통해서 원래 메소드를 호출 합니다.

항상 새로운 객체를 돌려받아야 할 때 사용하는 <lookup-method />와
웹 환경에서 다른 scope를 참조할 때 사용 하는 <aop:scoped-proxy />는
전혀 다른 방식의 Proxy를 사용하므로 잘 짚고 넘어가야 할 부분 같습니다.

출처 : http://jjaeko.tistory.com/13

549 view

4.0 stars