【发布时间】:2017-04-07 08:17:13
【问题描述】:
这更像是一个很好的练习题...
我们在 JSF 2.2 中将 JSF 托管 bean 转换为 CDI bean。这样做时,似乎在很多 bean 中,我们需要一些 sessionscoped bean。
我们最初打算@Inject 这些,但另一种选择是将它们注入父“FacesBean”类中的受保护变量中。
- 这是一种好的做法吗?
- @Inject 是否也适用于尚未转换为 CDI 的 @ManagedBean 类?
【问题讨论】:
这更像是一个很好的练习题...
我们在 JSF 2.2 中将 JSF 托管 bean 转换为 CDI bean。这样做时,似乎在很多 bean 中,我们需要一些 sessionscoped bean。
我们最初打算@Inject 这些,但另一种选择是将它们注入父“FacesBean”类中的受保护变量中。
【问题讨论】:
这么一来:
1) 好的做法?
如果您有一个类层次结构,我建议您将其@Inject 放入父级中的 private 字段中,然后创建一个所需可见性最低的 getter 方法(可能是受保护的)。只需遵守 Java 封装的一般良好实践规则即可。
2) @ManagedBean 和 @Inject?
只要您使用 bean 发现模式 all(使用空的 beans.xml),您的类将被自动拾取为托管 bean - 包括带有 @ManagedBean 注释的那些。一旦它是一个 bean,注入就起作用了。所以是的,只要类可以自动成为 bean,注入就会起作用(例如,它不是 @Vetoed 或不可代理等)
【讨论】:
@Dependent,否则您实际上只会注入一个指向 bean 的相同底层实例的代理对象).