이 설정을 기반으로 한 WebApplicationContext 컨테이너는 foo를 생성할 때 <aop:scoped-proxy /> 요소가 있으므로 foo에 대한 Proxy 객체를 생성 합니다. Foo(Proxy)객체에 적용된 intercept는 다음과 같습니다.(CGLIB 사용 할 경우)
여기서 중요한 것은 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를 사용하므로 잘 짚고 넘어가야 할 부분 같습니다.