内容来源于:https://stackoverflow.com/questions/5116352/when-we-should-use-scala-util-dynamicvariable
说明
1 | protected val _response = new DynamicVariable[HttpServletResponse](null) |
DynamicVariable是贷款和动态范围模式的实现。 DynamicVariable的使用情况与Java中的ThreadLocal非常相似(事实上,DynamicVariable在后台使用InheritableThreadLocal) – 当需要在一个封闭的作用域内进行计算时,每个线程都有自己的副本的变量值:1
2
3dynamicVariable.withValue(value){ valueInContext =>
// value used in the context
}
由于DynamicVariable使用可继承的ThreadLocal,变量的值被传递给上下文中生成的线程:1
2
3
4
5dynamicVariable.withValue(value){ valueInContext =>
spawn{
// value is passed to the spawned thread
}
}
DynamicVariable(和ThreadLocal)在Scalatra中使用的原因与在许多其他框架(Lift,Spring,Struts等)中使用的相同 – 它是一种非侵入性的方式来存储和传递上下文(线程)特定的信息。
使HttpServletResponse和HttpServletRequest动态变量(并因此,绑定到处理请求的特定线程)只是最简单的方法来获取它们在代码中的任何地方(不通过方法参数或任何其他显式)。
案例
1 | val dyn = new DynamicVariable[String]("withoutValue") |
结果
withoutValue
withValue
withoutValue