복붙노트

[SPRING] Spring MVC는 어떻게 여러 사용자를 다루는가?

SPRING

Spring MVC는 어떻게 여러 사용자를 다루는가?

나는 6 개월 넘게 봄을 사용하고 있습니다. 아래의 시나리오와 관련된 기본 메커니즘을 이해할 수 없습니다.

나는 스프링 웹 앱을 가지고있다. 이제 컨트롤러에서 모델을 자동 실행했습니다. 일치하는 URL을 기반으로 각 메소드를 호출합니다. 내 모든 방법은 싱글 톤입니다.

이제 두 명의 사용자가 동시에 앱을 시작하면 봄을 병렬로 실행하고 결과를 제공 할 수 있습니다. 나는 그것을 어떻게 할 수 있는지 이해하지 못했습니다. 빈은 싱글 톤이므로 빈이 사용되지 않거나 빈의 데이터를 덮어 쓸 때까지 대기해야합니다. 그러나 봄은 제대로 작동하고 있습니다. 누군가가이 비유를 일부 비유로 설명 할 수 있습니까?

내 질문에 명확하게 설명하려면 아래 코드를 작성하십시오.

내 기본 컨트롤러는 간단합니다.

@Autowired  
private AppModel aModel; 
public AppModel getModel(){
    return aModel;
}
public void setModel(AppModel aModel){
    this.aModel = aModel;
}

@RequestMapping(method = RequestMethod.GET)
public ModelAndView defaultGetter(HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    ModelAndView mav = new ModelAndView(getViewName());
    mav.addObject("model", aModel);
    Runtime.getRuntime().gc();
    return mav;
}

또한 어떤 사람은 두 클라이언트가 @autowired를 사용할 때 두 개의 개별 모델이 생성 될 때 앱을 열 때 알려 줄 수 있습니다. 모든 클라이언트에 대해 하나의 모델 bean 만 존재하면 클라이언트 1의 요청이 들어 왔고 결과를 얻기 위해 30 초가 걸린다 고합니다. 이제 두 번째 클라이언트가 3 초 내에 요청을 보내면 첫 번째 클라이언트 요청이 덮어 쓰기됩니까?

나는 혼란스러워하고 있다고 생각합니다. 어떤 사람이이 마법이 어떻게 일어나고 있는지 명확히 할 수 있습니까?

감사

해결법

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

    1.모든 웹 요청은이 스레드에서 설명한대로 새 스레드를 생성합니다.

    모든 웹 요청은이 스레드에서 설명한대로 새 스레드를 생성합니다.

    Spring은 다양한 범위 (프로토 타입, 요청, 세션, 싱글 톤)를 관리합니다. 두 개의 동시 요청이 싱글 톤 Bean에 액세스하는 경우, Bean은 Stateless (또는 적어도 문제를 피하기 위해 동기화 됨)이어야합니다. | 위 요청에서 bean에 액세스하면 요청 당 새 인스턴스가 생성됩니다. Spring은 이것을 당신을 위해 관리하지만 빈에 대한 올바른 범위를주의 깊게 사용해야한다. 일반적으로 컨트롤러는 싱글 톤이지만 AppModel은 범위 요청이어야하며, 그렇지 않으면 두 개의 동시 요청에 문제가 발생합니다. 이 스레드는 또한 당신을 도울 수 있습니다.

    마지막 질문에 대해 "이 마법이 어떻게 발생하고 있습니까?"대답은 "aspect / proxy"입니다. Spring은 프록시 클래스를 만든다. Spring이 AppModel 클래스에 대한 프록시를 생성한다고 상상할 수 있습니다. 컨트롤러에서 액세스하려고하면 Spring은 메소드 호출을 올바른 인스턴스로 전달합니다.

  2. from https://stackoverflow.com/questions/17235794/how-does-spring-mvc-handle-multiple-users by cc-by-sa and MIT license