Spring-MVC中的所有控制器是否都是单例的,并且在不同的会话和请求之间共享?
如果是这样,我假设一个类变量像
public String name;
所有请求和会话都一样吗?这样,如果用户X发出请求name并被设置为Paul,那么用户Z也具有Paul作为属性吗?
就我而言,我不希望这种行为,但想知道是否有更简单或更干净的OOP方式来拥有会话/请求变量,然后session.getAttribute()/request.getAttribute()
要回答你的第一个问题:是的,Spring MVC控制器默认为单例。对象字段将为所有请求和所有会话永久共享并可见。
但是,如果不进行任何同步,则可能会遇到各种各样的并发问题(竞争条件,可见性)。因此,你的字段应具有volatile
(和private
,顺便说一句)修饰符,以避免可见性问题。
回到你的主要问题:在Spring中,你可以使用request-和会话作用域bean。你可以将它们注入控制器和任何其他bean(甚至是单例!),但是Spring确保每个请求/会话都有一个独立的实例。
将请求范围和会话范围的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>
本文向大家介绍Python变量作用范围实例分析,包括了Python变量作用范围实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python变量作用范围。分享给大家供大家参考。具体如下: 希望本文所述对大家的Python程序设计有所帮助。
问题内容: 请考虑以下代码段: 哪里是我追求的是将包含字典,并且,除其他事项外。 我希望基本上能够引用字符串中当前作用域内的所有变量。因此,预期输出为: 我可以通过传递给实现。这是否总是正确的,或者在某些极端情况下此表达式将无法正确处理? 重写以澄清问题。 问题答案: 在执行操作时合并两个字典的最佳方法是(将本地变量覆盖全局变量)。 缺少将全局变量和本地变量合并的方法是(a)内置函数(我想这是故意
问题内容: 我需要一个与一系列gui事件几乎完全相同的回调函数。该函数的行为会有所不同,具体取决于调用该事件的事件。对我来说,这似乎是一个简单的案例,但是我无法弄清楚函数的这种奇怪行为。 因此,我在下面有以下简化代码: 此代码的输出是: 我期望: 为什么使用迭代器搞砸了? 我试过使用Deepcopy: 但这有同样的问题。 问题答案: 这里的问题是m变量(参考)来自周围的范围。仅参数保留在范围中。
本章介绍当模板在访问变量时发生了什么事情,还有变量是如何存储的。 当调用 Template.process 方法时,它会在方法内部创建一个 Environment 对象,在 process 返回之前一直使用。 该对象存储模板执行时的运行状态信息。除了这些,它还存储由模板中指令,如 assign, macro, local 或 global 创建的变量。 它不会尝试修改传递给 process 的数据
问题内容: 我正在测试下面的代码段,我需要知道如何访问tx或t.hello?它的范围是什么?开发人员是否以这种方式定义变量? 编辑 但是为什么这个片段起作用 问题答案: 您应该区分声明和定义。 在您的情况下,您声明一个class变量,并将其分配给派生自某个类的对象(这是一个匿名类),该对象中包含一些其他内容。 此定义之后的代码仅看到类,它对此一无所知,因为没有它们。 因此,除了反射之外,您不能使用
问题内容: 我知道变量作用域由块的开始和块的结尾包围。如果在块内声明了相同的变量,则会发生编译错误。但是,请看以下示例。 在这里,可以在方法中重新声明,尽管它已经在类中声明了。但是在块中,无法重新声明。 为什么类范围变量的重新声明不产生错误,而方法范围变量的重新声明却产生错误? 问题答案: 这是因为不是变量,而是实例字段。允许局部变量与字段具有相同的名称。为了区分变量和具有相同名称的字段,我们在实