上下文和作用域的区别

12

我在学习JSR-299时,阅读了Weld参考文档的第5.1节,其中解释了CDI中作用域(scope)的工作方式。显然,上下文(context)是一个与作用域紧密相关的概念。但它们之间的区别并不清楚,我感到甚至可以交替使用这两个词。

scope和context之间有什么区别?这两个概念之间的关系是什么?

3个回答

8
每个作用域都有一个独立的上下文。
上下文是定义了相应作用域的bean的容器。
这就是为什么上下文实现带有作用域的名称 - ApplicationContext、DependentContext、RequestContext等。
实际上,这是一些实现细节 - 作为CDI的用户,你只需要知道作用域(因为你为你的bean定义它),而实现决定将这些bean放在哪里以及如何管理它们的生命周期。

1
好的观点。让我补充一下,在Seam 2中,“上下文”是用户非常清楚的概念(@In@Out),而在CDI中,“作用域”才是正确的方式。这无疑是视角的改变。 - Jan Groth
我在哪里可以阅读更多关于这些上下文类的信息(Javadoc或其他文档)? - Puce

2
我的理解是,作用域指的是对象可以从哪里访问,而上下文枚举了程序执行中某个特定点可以访问的对象。(也就是说,我们谈论一个对象的作用域,以及程序执行某个特定点的上下文。) 从数学角度来看,两者都描述了可以访问的关系,但是从不同的方向来看待它。

可能更准确地说,变量的作用域。 - irreputable
虽然我总体上同意这个观点,但在谈论CDI时,这会产生误导,因为CDI实际上为对象定义了作用域,而不是变量。(在CDI中,一个对象的作用域结束(因此被销毁),与指向它的任何变量完全无关)。 - meriton
不是Java中的“变量”,而是一般意义上的。如果两个会话可以共享一个对象,则不适合谈论“对象”的“会话范围”。 - irreputable
如果两个会话可以共享一个对象,那么谈论对象的会话范围就没有意义,因为它根本不是会话范围,对吧? - brandizzi

1

首先,我们头脑中有一些概念,如应用程序、会话、请求。让我们在以下示例中使用会话概念。

如果我们认为某个执行片段正在为特定会话提供服务,我们将说该会话是执行的上下文的一部分;或者说,它是执行的会话上下文。

一个会话有一些变量,例如userName;我们将说该会话是这些变量的作用域。

由于两者都指向同一个会话,可能会令人困惑。例如,

get the userName from the session context
get the userName from the session scope

两者听起来都不错,因为我们正在谈论变量的执行。

以下示例按作用域的定义是可理解的。

the scope of the injected bean is Session

但我们并没有理解真正发生了什么的问题。如果我们想要,我们可以将其扩展到基本用词的基础上;我们不这样做是因为它会非常冗长。

作者面临着一个艰巨的任务,即简洁地表达文字,同时期望读者能够理解复杂的含义。关于上下文和范围的文本通常对那些尚未理解概念的人来说似乎是无意义的。

API名称更难以想出,因为代码不是英语句子。ContextScope几乎是可以互换的。如果只有一个对象代表一个会话,那么该类可能应该被命名为Session。如果我们将变量操作部分拆分,那么该部分可以称为SessionScope。然而,SessionContext的含义过于难以捉摸,从名称上看,我们最好能够理解的是它与会话有关 - 这里的“上下文”几乎是一个感叹词。


我的问题在于如何在一篇文章中准确地解释上下文和作用域。你和Meriton的解释都让我感到有道理,似乎谈论的是更或多或少相同的事情,尽管我发现他的解释更符合我的“感觉”。我希望能够得到一些标准、广泛采用的定义,但显然我将不得不选择自己的定义,不幸的是... - brandizzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接