首页 > 解决方案 > CDI 中的 C 到底是什么?

问题描述

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

上下文:将有状态组件的生命周期和交互绑定到定义明确但可扩展的生命周期上下文的能力

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

除了 DI 功能之外,CDI 的一个关键部分是它对 bean 上下文的感知以及对这些上下文中的 bean 生命周期和依赖关系的管理(例如 @RequestScoped 或 @ConversationScoped)。

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

这是一个正确的结论吗?

标签: jakarta-eecdi

解决方案


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

我通常认为上下文是一个表示进程环境的对象。就像 bash shell 的环境和内部包含许多环境变量的操作系统一样。它就像一种全局变量容器,流程可以在整个流程生命周期的任何时候轻松访问其变量。

理想情况下,环境应该彼此隔离。不同的进程有自己的隔离环境可以使用,这样一个进程就不会弄乱彼此的环境。想想如果我打开两个 bash shell 并在 shell1 中创建一个新变量,shell2 不应该在他们的环境中知道这个变量。

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

CDI 帮助管理这些进程的环境,以便每个进程都有自己的隔离环境。例如,在 session context 的情况下,它在内部保留所有@SessionScopedbean 。CDI 确保每个 HTTP 会话在后台正确访问自己的隔离上下文,从而将正确的@SessionScopedbean 注入代码中。


推荐阅读