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 实例。
另请参阅:
- CDI: Contexts and Dependency Injection for the Java EE platform - Client proxies
- Java EE 6 @javax.annotation.ManagedBean vs. @javax.inject.Named vs. @javax.faces.ManagedBean
- Backing beans (@ManagedBean) or CDI Beans (@Named)?
- ManagedProperty in CDI @Named bean returns null
这是在 @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 实例。
另请参阅:
- CDI: Contexts and Dependency Injection for the Java EE platform - Client proxies
- Java EE 6 @javax.annotation.ManagedBean vs. @javax.inject.Named vs. @javax.faces.ManagedBean
- Backing beans (@ManagedBean) or CDI Beans (@Named)?
- ManagedProperty in CDI @Named bean returns null