我看到它的方式,有三种方法可以获得对另一个bean的引用:
@Inject
一个命名的bean。这样做的缺点是CDI注释与面部注释不能很好地融合,因此我再也不能使用@ViewScoped
。@ManagedProperty
似乎是理想的,除了我必须引入一个公共设置器才能工作,这会伤害封装。我可以使用这样的东西(在this answer中提出):
@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
FacesContext context = FacesContext.getCurrentInstance();
return (T) context.getApplication().evaluateExpressionGet(
context, "#{" + beanName + "}", Object.class);
}
我可以使用此方法初始化@PostConstruct
中的属性。这没有上述缺点,但似乎有点复杂。为什么我必须为框架应该提供的东西编写一个辅助方法?
我的问题是,我应该使用上述三个中的哪一个?此外,请随时纠正我在上述说明中所述的任何误解,或提出其他(更优雅)方法来实现该目标。
答案 0 :(得分:3)
如果没有@ViewScoed你真的不能上帝,而你想只留下JSF和CDI - 那么第二个。不要担心外部依赖的封装。即使在面部上下文之外,您仍然必须以某种方式设置另一个对象,因此设置器应该到期。
如果你想为图片添加接缝,而你正在使用CDI,那么第一个。请参阅jan groth的回答。
答案 1 :(得分:2)
绝对是第1名,连同Seam 3 Faces(here)。只需将它放在你的类路径中,@ Viewscoped就可以完美地在CDI和JSF之间架起桥梁:-)不用说CDI具有比JSF附带的依赖注入更优越的概念......