복붙노트

[SPRING] 스프링 컨트롤러의 범위와 인스턴스 변수

SPRING

스프링 컨트롤러의 범위와 인스턴스 변수

모든 컨트롤러는 Spring MVC 싱글 톤이며 다른 세션과 요청간에 공유됩니까?

그렇다면 클래스 변수를 다음과 같이 가정합니다.

public String name;

모든 요청과 세션에서 동일하게 적용됩니까? 따라서 사용자 X가 요청을하고 이름이 Paul으로 설정된 경우 사용자 Z도 Paul을 속성으로 사용합니까?

내 경우에는 그 행동을 원하지 않지만 세션 / 요청 변수를 갖는 것이 더 쉽고 더 깨끗한 OOP 방법이 있는지 궁금해했다. session.getAttribute () / request.getAttribute ()

해결법

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

    1.첫 번째 질문에 대답하려면 : 예, 스프링 MVC 컨트롤러는 기본적으로 싱글 톤입니다. 객체 필드는 모든 요청과 모든 세션에서 영원히 공유되고 볼 수 있습니다.

    첫 번째 질문에 대답하려면 : 예, 스프링 MVC 컨트롤러는 기본적으로 싱글 톤입니다. 객체 필드는 모든 요청과 모든 세션에서 영원히 공유되고 볼 수 있습니다.

    그러나 어떤 동기화도없이 모든 종류의 동시성 문제 (경쟁 조건, 가시성)에 부딪 힐 수 있습니다. 따라서 가시성 문제를 피하기 위해 필드에 휘발성 (및 개인용) 수정자가 있어야합니다.

    주요 질문으로 돌아가서 : 봄에서는 요청 - (4.5.4.2 요청 범위 참조)과 세션 - 범위 (4.5.4.3 세션 범위 참조) 빈을 사용할 수 있습니다. 컨트롤러와 다른 빈 (심지어 싱글 톤!)에도 삽입 할 수 있지만, Spring은 각 요청 / 세션이 독립 인스턴스를 가지도록합니다.

    요청 - 및 세션 - 범위 콩을 싱글 톤으로 주입 할 때 기억해야 할 것은 범위가 지정된 프록시로 그들을 감싸는 것입니다 (예 : 4.5.4.5 Scoped beans from dependencies) :

    <!-- an HTTP Session-scoped bean exposed as a proxy -->
    <bean id="userPreferences" class="com.foo.UserPreferences" scope="session">
    
        <!-- instructs the container to proxy the surrounding bean -->
        <aop:scoped-proxy/>
    </bean>
    
  2. ==============================

    2.예, Spring-MVC의 컨트롤러는 싱글 톤입니다. 여러 요청 사이에 클래스 변수가 공유되어 모호한 결과가 발생할 수 있습니다. 컨트롤러 위에 @Scope ( "request") 주석을 사용하여 이러한 모호성을 피할 수 있습니다.

    예, Spring-MVC의 컨트롤러는 싱글 톤입니다. 여러 요청 사이에 클래스 변수가 공유되어 모호한 결과가 발생할 수 있습니다. 컨트롤러 위에 @Scope ( "request") 주석을 사용하여 이러한 모호성을 피할 수 있습니다.

  3. from https://stackoverflow.com/questions/11139571/scope-of-a-spring-controller-and-its-instance-variables by cc-by-sa and MIT license