gpt4 book ai didi

spring - Spring-Controller 及其实例变量的范围

转载 作者:IT老高 更新时间:2023-10-28 13:03:56 25 4
gpt4 key购买 nike

Spring-MVC 中的所有 Controller 都是单例的,并且在不同的 session 和请求之间共享吗?

如果是这样,我假设类变量像

public String name;

所有请求和 session 都相同吗?这样如果用户 X 发出请求并且 name正在设置为 Paul,用户 Z 也有 Paul 作为属性?

在我的情况下,我不希望这种行为,但想知道是否有比 session.getAttribute() 更简单或更简洁的 OOP 方式来拥有 session /请求变量。/request.getAttribute()

最佳答案

回答你的第一个问题:是的,Spring MVC Controller 默认是单例的。对象字段将永远对所有请求和所有 session 共享和可见。

但是,如果没有任何同步,您可能会遇到各种并发问题(竞争条件、可见性)。因此,您的字段应该具有 volatile(顺便说一下,private)修饰符以避免可见性问题。

回到您的主要问题:在 Spring 中,您可以使用 request-(参见 4.5.4.2 Request scope)和 session-scoped(参见:4.5.4.3 Session scope)bean。您可以将它们注入(inject) Controller 和任何其他 bean(甚至是单例!),但 Spring 确保每个请求/ session 都有一个独立的实例。

在将请求和 session 范围的 bean 注入(inject)单例时,唯一要记住的是将它们包装在范围代理中(示例取自 4.5.4.5 Scoped beans as 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>

关于spring - Spring-Controller 及其实例变量的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11139571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com