【问题标题】:What exactly is C in CDI?CDI 中的 C 到底是什么?
【发布时间】:2019-08-10 20:08:08
【问题描述】:

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

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

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

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

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

这是一个正确的结论吗?

【问题讨论】:

  • 您是在问CDI 代表什么 还是上下文是什么
  • @chrylis 我明白什么是依赖注入。 CDI 代表上下文和依赖注入。问题是这些上下文是什么。
  • @JanBodnar - 我想如果我需要更好的答案,我会想办法的。
  • SO 作为教程来源并不是很卑鄙。它更多的是对特定问题的特定答案。我的建议是,一般而言,该问题已被提出并得到回答,并且在更一般的资源中可以更好地找到更深入的理解。

标签: jakarta-ee cdi


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 这个问题已经有一个副本。如果您认为那里的答案不够好,请在此处添加答案。它可以防止碎片化(并且将此 Q 投票为重复有助于用您的附加答案引用另一个问题。
  • 更好的“复制”:stackoverflow.com/questions/6565047/…
猜你喜欢
  • 1970-01-01
  • 2011-03-06
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2012-05-27
  • 2014-05-06
相关资源
最近更新 更多