CDI中的C到底是什么?

What exactly is C in CDI?

我在 CDI 上看到的所有材料都令人困惑或难以理解 CDI 中上下文的性质。

Contexts: The ability to bind the lifecycle and interactions of stateful components to well-defined but extensible lifecycle contexts

这个定义表明上下文与生命周期有关;

A key part of CDI aside of its DI capabilities is its awarness of bean contexts and the management of bean lifecycle and dependencies within those contexts (such as @RequestScoped or @ConversationScoped).

这个解释看了好几遍,我得出的结论是, 它表明上下文是可以注入 bean 的地方;例如 servlet 容器、ejb 容器或一些 Java SE 容器。

这个结论正确吗?

我也很难理解上下文是什么。让我试着用我自己的话来解释一下。

我通常认为上下文是表示进程环境的对象。就像bashshell和OS的环境一样,里面包含了很多环境变量。它就像一种全局变量容器,流程可以在整个流程生命周期的任何时间轻松访问其变量。

理想情况下,环境应该相互隔离。不同的进程有自己的隔离环境来工作,这样一个进程就不会弄乱彼此的环境。认为如果我打开两个 bash shell 并在 shell1 中创建一个新变量, shell2 应该不会在他们的环境中意识到这个变量。

在 CDI 中,进程可以是 运行 一个应用程序,处理 HTTP 请求,处理 HTTP 会话或处理对话等,每种类型的进程都有自己的上下文类型,即应用程序上下文,分别是请求上下文、会话上下文和对话上下文。每个上下文内部只能包含范围与该上下文支持的范围相同的对象(例如应用程序上下文存储 @ApplicationScoped bean 等)

CDI 的作用是为这些进程管理一个环境,使每个进程都有自己的隔离环境。例如,在会话上下文的情况下,它在内部保留所有 @SessionScoped bean。 CDI 确保每个 HTTP 会话在幕后正确访问它们自己的隔离上下文,因此正确的 @SessionScoped bean 被注入到代码中。