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”)注释以避免这种歧义。
- Spring MVC – 如何在Rest Controller中将简单string作为JSON返回
- 如何让春季将价值注入静态领域
- Spring Data JPA有没有办法使用方法名称parsing来计数实体?
- 注释configurationreplace为mvc:资源 – Spring
- 将Bean注入到Spring托pipe上下文之外的类中
- javax.servlet.ServletException不能在spring web app中parsing为types
- 如何在Spring applicationContext中读取System环境variables
- Spring bean的作用域:session和globalSession
- 如何在Spring中获得会话对象?