我在 JBoss EAP 6 上使用 Java EE 6,我的 JSF bean 注释如下:(
@ManagedBean @ViewScoped
都来自javax.faces.bean
包)
但是,它们也是 CDI bean(默认构造函数、使用@Inject
等@PreDestroy
)。我一直在阅读,您不能混合使用这些注释(JSF 和 CDI),但它显然工作正常:注入工作正常,在视图更改时调用 preDestroy 等)。
我错过了什么吗?问题是什么?为什么不使用?
我在 JBoss EAP 6 上使用 Java EE 6,我的 JSF bean 注释如下:(
@ManagedBean @ViewScoped
都来自javax.faces.bean
包)
但是,它们也是 CDI bean(默认构造函数、使用@Inject
等@PreDestroy
)。我一直在阅读,您不能混合使用这些注释(JSF 和 CDI),但它显然工作正常:注入工作正常,在视图更改时调用 preDestroy 等)。
我错过了什么吗?问题是什么?为什么不使用?
CDI @Inject
“无处不在”,因此也在 JSF 内部@ManagedBean
。JSF 对应项仅@ManagedProperty
在内部工作@ManagedBean
。您也不能@Inject
在任何 CDI 托管 bean 中使用真正的 JSF 托管 bean(相反,它将是一个 CDI 托管实例)。也许这就是您正在阅读的内容。然而,普遍的共识确实是最好不要混合它们以避免在初学者之间产生混淆。JSF 实用程序库 OmniFaces具有与@ViewScoped
JSF 2.0/2.1 兼容的 CDI。
@PreDestroy
顺便说一下,它不是CDI 特有的,它的对应物也不是@PostConstruct
。它们在 CDI 托管 bean 和 JSF 托管 bean 中应该都能正常工作。