下面你可以看到Something
类,它是一个request
范围内的bean,我一直面临着一个问题。
一旦我设置static boolVariable
字段,其值就会在会话中存活。
方案:
应用程序中的用户执行将变量设置为true的操作,然后注销,清除每个数据(cookie,缓存...)。当它再次登录到应用程序时,boolVariable
仍然是true
(他没有再次设置他的值),而我认为它是假的。
引自concretepage:
在HTTP请求中,请求范围bean中所做的更改不会 影响其他HTTP请求。一旦HTTP请求完成,就可以了 请求scoped bean的实例也被破坏。
以下是Something
类:
@Service(value = "Something")
@Scope(value = "request")
public class Something {
private static boolean boolVariable = false;
public Something() {
}
public static void setBoolVariable(boolean toBeSaved) {
boolVariable = toBeSaved;
}
private boolean isBoolVariable() {
return boolVariable;
}
}
您能解释为什么上述行为会发生吗?
(当我重新启动服务器时,boolVariable
值将恢复为false
)
答案 0 :(得分:2)
当类加载到JVM中时,会初始化静态变量。状态是全局的,并且在JVM进程的生命周期内由所有实例共享。这解释了为什么在重新启动JVM时重新初始化静态变量
您的bean是请求作用域。它是根据请求重新创建的bean实例,而不是全局状态(静态变量)。为什么你甚至必须使变量保持静态。这似乎是会话状态(特定于客户端的状态)。当它静止时你也要担心线程安全。
更改为实例变量,以便每个请求的作用域bean都是自己的状态。否则,如果它的共享状态,那么你的bean是单例范围的候选者而不是请求范围
Spring不会以特殊方式处理静态变量。它使用标准Java语义