복붙노트

[SPRING] Spring MVC Controller의 클래스 속성으로서 Session scope bean

SPRING

Spring MVC Controller의 클래스 속성으로서 Session scope bean

User 클래스가 있습니다.

@Component
@Scope("session")
public class User {
    private String username;
}

그리고 컨트롤러 클래스 :

@Controller
public class UserManager {
    @Autowired
    private User user;

    @ModelAttribute("user")
    private User createUser() {
        return user;
    }

    @RequestMapping(value = "/user")
    public String getUser(HttpServletRequest request) {
        Random r = new Random();
        user.setUsername(new Double(r.nextDouble()).toString());
        request.getSession().invalidate();
        request.getSession(true);
        return "user";
    }
}

세션을 무효화하여 다음에 / users를 얻었을 때 다른 사용자를 얻습니다. 사용자의 세션 범위 때문에 다른 사용자를 기다리고 있지만 동일한 사용자가 있습니다. 내가 디버그 모드에서 확인하고 그것은 메모리에있는 동일한 개체 ID입니다. 내 bean은 다음과 같이 선언된다 :

    <bean id="user" class="org.synchronica.domain.User">
        <aop:scoped-proxy/>
    </bean>

나는 봄이 처음이에요. 그래서 나는 분명히 뭔가 잘못하고 있습니다. 각 세션마다 하나의 사용자 인스턴스가 필요합니다. 방법?

해결법

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

    1.이것이 예상되는 동작입니다. 로 빈에 태그를 붙이면 프록시가 생성됩니다. 빈에 대한 인터페이스가 있다면 자바 동적 프록시가 생성됩니다. 그렇지 않으면 CGLIB 기반 프록시가 생성됩니다. 사용자 클래스에 상위 클래스 / 인터페이스가 없기 때문에 CGLIB 기반 프록시가 생성됩니다.

    이것이 예상되는 동작입니다. 로 빈에 태그를 붙이면 프록시가 생성됩니다. 빈에 대한 인터페이스가 있다면 자바 동적 프록시가 생성됩니다. 그렇지 않으면 CGLIB 기반 프록시가 생성됩니다. 사용자 클래스에 상위 클래스 / 인터페이스가 없기 때문에 CGLIB 기반 프록시가 생성됩니다.

    이제 잡기는이 프록시가 모든 클래스에 주입된다는 것입니다. 즉, 프록시 (본질적으로 프록시의 1 인스턴스 만 보게되는 이유입니다. 프록시는 범위를 관리하는 방법을 알고 있습니다. 클래스의 메서드를 통해 getter 및 setter 호출을 통해 User 클래스의 속성을 가져 오는 경우 해당 세션에 적합한 값이 반영되어야합니다.

  2. from https://stackoverflow.com/questions/13533038/session-scoped-bean-as-class-attribute-of-spring-mvc-controller by cc-by-sa and MIT license