복붙노트

[SPRING] 봄 범위의 프록시 빈

SPRING

봄 범위의 프록시 빈

누군가가 봄 @ 스코프 프록시 주석의 사용법을 설명 할 수 있습니까? 세션 스코프 된 콩과 관련이 있다고 생각했지만, 무엇이 확실하지 않습니다.

나의 스코프 사용법에서는 @ScopedProxy 주석없이 (또는 스코프 프록시를 사용하지 않고) 세션 범위 Bean을 사용 했으므로 제대로 사용하는 방법을 잘 알고있다.

해결법

  1. ==============================

    1.스프링 문서의 3.4.4.5 절에서이 부분을 매우 잘 설명합니다.

    스프링 문서의 3.4.4.5 절에서이 부분을 매우 잘 설명합니다.

    (다음과 같은 'userPreferences'bean 정의는 완전하지 않습니다.)

    <bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
    
    <bean id="userManager" class="com.foo.UserManager">
        <property name="userPreferences" ref="userPreferences"/>
    </bean>
    

    위의 구성에서 싱글 톤 Bean 'userManager'에 HTTP 세션 범위 bean 'userPreferences'에 대한 참조가 주입되고 있음이 분명합니다. 여기서 주목할 점은 'userManager'bean이 싱글 톤 (singleton)이라는 것입니다. 이것은 컨테이너 당 정확히 한 번만 인스턴스화 될 것이고, 의존성 (이 경우에는 'userPreferences'bean) 만 주입 될 것입니다! ).

    즉, 'userManager'는 개념적으로 동일한 'userPreferences'객체, 즉 원래 삽입 된 객체에서만 작동합니다.

    이는 협업 객체 (일반적으로)에 대한 HTTP Session-scope bean을 의존성으로 주입 할 때 원하는 것이 아닙니다. 오히려 우리가 원하는 것은 컨테이너 당 하나의 'userManager'객체이며, HTTP Session의 수명 동안, HTTP 세션과 관련된 'userPreferences'객체를보고 사용하고자합니다.

    오히려 필요한 것은 UserPreferences 클래스 (이상적으로는 UserPreferences 인스턴스 인 객체)와 완전히 동일한 공용 인터페이스를 노출하고 실제 UserPreferences 객체를 가져올 수있을만큼 똑똑한 객체를 삽입하는 것입니다 (HTTP 요청, 세션 등) 어떤 기본 범위 지정 메커니즘을 선택했는지 결정합니다. 그런 다음이 프록시 객체를 'userManager'bean에 안전하게 주입 할 수 있습니다.이 bean은 사용자가 상주하고있는 UserPreferences 참조가 프록시임을 기쁜 마음으로 알 수 있습니다.

    우리의 경우, UserManager 인스턴스가 종속성이 삽입 된 UserPreferences 객체에 대한 메소드를 호출 할 때 실제로 프록시에서 메소드를 호출하게 될 것입니다 ... 그러면 프록시가 해제되어 실제 UserPreferences 객체를 가져옵니다 (이 경우) HTTP 세션을 생성하고 메소드 호출을 검색된 실제 UserPreferences 객체에 위임합니다.

    따라서 request-, session- 및 globalSession 범위 Bean을 협업 오브젝트에 주입 할 때 다음의 올 Y 른 완료 W 구성이 필요합니다.

    <bean id="userPreferences" class="com.foo.UserPreferences" scope="session">
        <aop:scoped-proxy/>
    </bean>
    
    <bean id="userManager" class="com.foo.UserManager">
        <property name="userPreferences" ref="userPreferences"/>
    </bean>
    
  2. ==============================

    2.여기에 지정된 다양한 옵션과 스프링 문서를 사용해 본 후 Spring MVC가 @Controller 주석을 사용할 때 wierdly autowiring 컨트롤러이고 webapp에 둘 이상의 컨트롤러가있는 곳을 알아 냈습니다. 주석을 @RestController (value = "UniqueControllerv1")로 수정하면 문제가 해결됩니다.

    여기에 지정된 다양한 옵션과 스프링 문서를 사용해 본 후 Spring MVC가 @Controller 주석을 사용할 때 wierdly autowiring 컨트롤러이고 webapp에 둘 이상의 컨트롤러가있는 곳을 알아 냈습니다. 주석을 @RestController (value = "UniqueControllerv1")로 수정하면 문제가 해결됩니다.

  3. from https://stackoverflow.com/questions/14371335/spring-scoped-proxy-bean by cc-by-sa and MIT license