JSF 2.0 中定义受管 Bean 的四种方式

时间:2021-04-14 19:11:05

JSF 2.0 大量采用标注,从而使 web/WEB-INF/faces-config.xml 不再必需。本文介绍并比较了三种途径来定义可从页面上的 EL 表达式中引用的受管 Bean。
现在假设你有下面这个 Bean 类,并想让它受管于会话范围:
public class MyManagedBean implements Serializable {...}

第一种:

在 JSF 2.0 之前,你需要将它配置到 web/WEB-INF/faces-config.xml 中: 
<managed-bean> 
    <managed-bean-name>mmb</managed-bean-name> 
    <managed-bean-class>com.mycom.MyManagedBean</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
</managed-bean> 

这不仅枯燥,而且难以管理、容易出错。faces-config.xml 不仅用于配置受管 Bean,还用于导航规则。如果你在做一个大的互联网项目,该文件可能会增大到上千行。你还可能会犯拼写错误,例如写错 Bean 类名,使你直至运行时才意识到问题。显然在 JSF 2.0 中,这不是优先的途径。 


第二种途径由 JSR 314,也就是 JavaServer Faces 2.0 本身提供。你只需将两个标注应用到类定义上:


@javax.faces.bean.ManagedBean(name = "mmb") 
@javax.faces.bean.SessionScoped 
public class MyManagedBean implements Serializable {...} 
没什么特别的,但直截了当!用这些标注,你就可以从此避免 XML 配置的枯燥和不小心拼错字。然而,这并不是最佳途径,因为 JSR 299 中定义的 CDI(用于 Java™ EE 平台的上下文和依赖注入)提供了类似且强大得多的标注: 

第三种CDI注解:

@javax.inject.Named("mmb") 
@javax.enterprise.context.SessionScoped 
public class MyManagedBean implements Serializable {...} 
为什么要优先采用 CDI?因为正如其名,它是用于依赖注入的通用框架,也就是说它不但可用于 JSF,还能用于任何其他的 Java EE 6 技术,而且我听说 Spring 3.0 也将支持它。详细的文档可从 Weld 主页找到,这里 Weld 是 JSR 299 的参考实现。 



第四种是完全使用Spring来管理.

也还行.但觉得还是CDI比较好.不过我的架子貌似是用的Spring管理的
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

@Controller
@Scope("view")
public class UserinfoBean extends BaseBean<Userinfo> implements Serializable{
.................}