【问题标题】:CDI beans injectionCDI bean 注入
【发布时间】:2015-03-01 11:25:56
【问题描述】:

这是在@SessionScoped bean 中注入@ApplicationScoped bean 的正确方法吗?这会导致我的应用程序范围的 bean 存储在每个用户的会话中吗?

我有一个应用程序范围的 bean,其中包含我们在所有系统用户之间共享的一些值,现在我需要在会话 bean 的方法中获取这些值。

【问题讨论】:

  • 你的问题很模糊。你能准确地说明你想要做什么吗?此外,将应用程序范围的 bean 注入会话 bean 是非常安全的,反之亦然。
  • 您好 Maress,您已经回答了我的问题,即注入应用程序范围内的 int 会话 bean 非常安全。如果您回答这个问题,我会很高兴并将其标记为已回答,但如果您提供更多解释为什么它是安全的,我将非常感激。

标签: jsf cdi jsf-2.2 managed-bean


【解决方案1】:

在 JSF 或 CDI bean 中,在另一个 bean 中注入相同或更广泛范围的 bean 是完全合法且正确的,就像您提供的示例一样。

CDI bean 和 JSF 托管 bean 之间的区别在于,当您尝试将一个范围更窄的 bean 注入另一个 bean 时(例如,将 @RequestScoped bean 注入 @SessionScoped 一个),这只有在您正在使用 CDI @Named bean,但在使用 JSF @ManagedBean 时无法使用。

CDI bean 之所以可以做到这一点,与其Proxy Pattern 机制有关,它比 JSF 机制更灵活(基于调用 setter 以直接注入物理实例)。

这种代理机制,允许 CDI 容器传递对代理的引用而不是注入的 bean(除非 bean 具有默认范围 @Dependent)。因此,该代理将负责处理对注入 bean 的所有调用并将它们转发/重定向到正确的 bean 实例。

另见:

【讨论】:

  • 这在 JSF 中也是可能的。只有反过来(在应用程序范围的 bean 中注入会话范围的 bean)在 JSF 托管 bean 中是不可能的。确实正是因为代理模式的原因,只有在 CDI 中才有可能。
  • @BalusC 发生的事情是我在回答时想的是相反的(他正在注入一个范围更窄的 bean)。感谢您的指导
  • 嗨,例如,如果我在 ApplicationScoped bean 中注入了一个 VS bean(ViewScoped) 并且有多个 VS bean,1-会注入哪一个呢? 2- 有没有没有VS bean可以注入的情况?如果是这样,会发生什么?
猜你喜欢
  • 2014-06-02
  • 2015-04-15
  • 2015-02-12
  • 2016-06-08
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多