我在学习JSR-299时,阅读了Weld参考文档的第5.1节,其中解释了CDI中作用域(scope)的工作方式。显然,上下文(context)是一个与作用域紧密相关的概念。但它们之间的区别并不清楚,我感到甚至可以交替使用这两个词。
scope和context之间有什么区别?这两个概念之间的关系是什么?
首先,我们头脑中有一些概念,如应用程序、会话、请求。让我们在以下示例中使用会话概念。
如果我们认为某个执行片段正在为特定会话提供服务,我们将说该会话是执行的上下文的一部分;或者说,它是执行的会话上下文。
一个会话有一些变量,例如userName
;我们将说该会话是这些变量的作用域。
由于两者都指向同一个会话,可能会令人困惑。例如,
get the userName from the session context
get the userName from the session scope
两者听起来都不错,因为我们正在谈论变量的执行。
以下示例按作用域的定义是可理解的。
the scope of the injected bean is Session
但我们并没有理解真正发生了什么的问题。如果我们想要,我们可以将其扩展到基本用词的基础上;我们不这样做是因为它会非常冗长。
作者面临着一个艰巨的任务,即简洁地表达文字,同时期望读者能够理解复杂的含义。关于上下文和范围的文本通常对那些尚未理解概念的人来说似乎是无意义的。
API名称更难以想出,因为代码不是英语句子。Context
或Scope
几乎是可以互换的。如果只有一个对象代表一个会话,那么该类可能应该被命名为Session
。如果我们将变量操作部分拆分,那么该部分可以称为SessionScope
。然而,SessionContext
的含义过于难以捉摸,从名称上看,我们最好能够理解的是它与会话有关 - 这里的“上下文”几乎是一个感叹词。
@In
,@Out
),而在CDI中,“作用域”才是正确的方式。这无疑是视角的改变。 - Jan Groth