Spring控制器的范围及其实例variables

所有的控制器都是Spring-MVC单例,并在不同的会话和请求之间共享?

如果是这样,我假设一个类variables

public String name; 

所有的请求和会话都一样吗? 因此,如果用户X发出请求并将name设置为Paul ,则用户Z也将Paul作为属性?

在我的情况下,我不希望这种行为,但想知道是否有一个更简单,或更清洁的OOP方式有会话/请求variables,然后session.getAttribute() / request.getAttribute()

回答你的第一个问题:是的,默认情况下,Spring MVC控制器是单身。 一个对象字段将被共享,并永远可见所有请求和所有会话。

但是,如果没有任何同步,可能会遇到各种并发问题(竞争条件,可见性)。 因此,你的领域应该有volatile (和private ,修改器),以避免可见性问题。

回到您的主要问题:在Spring中,您可以使用request- (请参阅4.5.4.2请求范围 )和会话范围 (请参阅: 4.5.4.3 Session范围 )bean。 你可以将它们注入控制器和其他bean(甚至是单身!),但是Spring会确保每个请求/会话都有一个独立的实例。

将请求和会话范围的bean注入到单例中时唯一要记住的事情是将它们包含在作用域代理中(从4.5.4.5作为依赖关系的范围bean中取得的示例):

 <!-- 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> 

是的,Spring-MVC中的控制器是单身人士。 在多个请求之间,你的类variables被共享,并可能导致模糊。 您可以在您的控制器上方使用@Scope(“request”)注释以避免这种歧义。