学习JSR-299,我阅读了Weld reference的第5.1节,其中解释了范围在CDI中的工作原理。显然,语境是与范围密切相关的概念。我已经理解了每一个是什么,但在我的脑海里并没有非常清楚地分开,我甚至想要交替使用这些词。
范围和背景有什么区别?这两个概念之间有什么关系?
我希望CDI领域有一个答案,但我对一般的Java有疑问,因为这些概念也用于其他环境。实际上,一般来说,在CDI,Java 和的上下文中解释概念的答案会得到更多的分数 - 如果我能给它们的话。
答案 0 :(得分:7)
每个范围都有一个单独的上下文。
上下文是使用相应范围定义的bean的容器。
这就是上下文实现带有范围名称的原因 - ApplicationContext
,DependentContext
,RequestContext
等。
实际上这是一个实现细节 - 作为CDI的用户,您应该只了解范围(因为您为bean定义了它),并且实现决定了放置这些bean的位置以及如何管理它们的生命周期。
答案 1 :(得分:2)
我的理解是范围是指可以从中访问对象的位置,而上下文枚举可以从程序执行中的某个特定点访问的对象。 (也就是说,我们讨论对象的范围,以及程序执行中某个特定点的上下文。)
从数学上讲,两者都描述了可以访问的关系,但是在不同的方向上看它。
答案 2 :(得分: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名称更难以提出,因为代码不是英语句子。 Context
或Scope
几乎可以互换。如果只有一个对象代表一个会话,那么该类可能只应命名为Session
。如果我们拆分有关变量操作的部分,那么该部分可以称为SessionScope
。然而,SessionContext
的含义太难以捉摸了,从名称来看,我们所知道的最好的是它与某个会话有关 - 这里的“背景”几乎是一个咒骂。