CDI豆注射

Jim*_*Jim 1 jsf cdi managed-bean jsf-2.2

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

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

Tar*_*rik 5

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

CDI bean和JSF托管bean之间的区别在于,当您尝试在另一个bean中注入较窄范围的bean时(例​​如将@RequestScopedbean注入@SessionScoped一个),只有在使用CDI @Namedbean 时才可能,但这是不可能的使用JSF时@ManagedBean.

CDI bean可能的原因与它们的代理模式机制有关,与JSF机制相比,它更灵活(基于调用setter以直接注入物理实例).

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

也可以看看:

  • 它在JSF中也是可能的.只有相反的方法(在应用程序范围的bean中注入会话范围的bean)在JSF托管bean中是不可能的.确实只有在CDI中才能实现代理模式的原因. (2认同)