在我看来,有三种方法可以获得对另一个bean的引用:
- 使用CDI,我可以
@Inject
一个命名的bean。这样做的缺点是CDI注释不能很好地与面注释混合,因此我不能再使用@ViewScoped
了 - 使用
@ManagedProperty
似乎是理想的,除了我必须引入一个公共设置器才能工作之外,这会损害封装 -
我可以使用这样的东西(在这个答案中提出):
@SuppressWarnings("unchecked") public static <T> T findBean(String beanName) { FacesContext context = FacesContext.getCurrentInstance(); return (T) context.getApplication().evaluateExpressionGet( context, "#{" + beanName + "}", Object.class); }
我可以使用此方法初始化
@PostConstruct
中的属性。这没有上述缺点,但看起来有点复杂。为什么我必须为框架应该提供的东西编写一个helper方法?
我的问题是,我应该使用以上三种中的哪一种?此外,请随时纠正我在上述描述中可能提出的任何误解,或提出其他(更优雅的)方法来实现这一目标。
如果你真的不能离开@ViewScoed,并且你只想使用JSF和CDI,那么第二个。不要担心外部依赖项的封装。即使在faces上下文之外,您仍然必须以某种方式设置另一个对象,因此应该使用setter。
如果你想在图片中添加接缝,并且你无论如何都在使用CDI,那么第一个。看看詹格罗斯的回答。
绝对是第一个,以及Seam 3 Faces(此处)。只要把它放在类路径中,@Viewscoped就完美地连接在CDI和JSF之间:-)不用说,CDI在依赖注入方面的概念远远优于JSF。。。