CDI bean注入

CDI beans injection

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

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

在 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 实例。

另请参阅: