为什么在使用JSF Web应用程序时我们需要beans.xml?

时间:2011-05-29 20:05:39

标签: jsf-2 javabeans

在研究了JSP和Servlets一段时间之后,我开始使用JSF进行Web开发。

当你创建一个JSF Web应用程序时,你总是(可能经常但我不确定它是否总是这样)必须创建beans.xml而你不会在其中写任何东西。但是,如果该文件不存在,JSF Web应用程序将无法运行。

背后的原因是什么?

为什么我们需要该文件?

请详细说明。

3 个答案:

答案 0 :(得分:4)

beans.xml文件的存在表示应用程序使用JSR-299(上下文和依赖注入)的servlet容器 - 没有它,应用程序的类也不会被扫描用于CDI注释,并且不会执行依赖注入。如果您不使用CDI(例如,您只使用普通的JSF托管bean),则不需要beans.xml。如果这样做,您可以使用该文件(而不是注释)来定义CDI配置 - 例如,这允许您提供测试配置,其中某些依赖项被模拟替换。

答案 1 :(得分:3)

添加迈克尔的答案;由于注入支持,CDI不仅可以与JSF结合使用,还因为它支持与EL(表达式语言)一起使用。这是JSF严重依赖的功能。

事实上,CDI bean几乎可以完全取代JSF托管bean,因此你会发现很多使用它们的例子和大量的JSF书籍建议使用它们。对于JSF应用程序,CDI bean具有例如以下优点:

  1. 可以将较小的范围注入更大的范围。例如。请求范围的GET参数可以注入到会话范围的bean中。对于JSF托管bean,这是不可能的。
  2. 可以利用会话范围;产生多个不同页面的范围。
  3. 非常不幸的是,在JSF 2.0和2.1中,默认情况下CDI bean不支持非常方便的视图范围,尽管像Seam这样的扩展可以添加这些范围。 (更新:在JSF 2.2中有一个新的视图范围可以与CDI bean一起使用)

    总而言之,JSF托管bean和CDI bean之间存在混淆,因此存在JSF规范问题,请参阅http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-976

答案 2 :(得分:0)

来自Getting Started with Contexts and Dependency Injection and JSF 2.x

  

部署应用程序时,服务器会查找CDI托管bean。在Java EE 7应用程序中,默认情况下会扫描路径上的类以获取CDI注释。在Java EE 6应用程序中,如果模块包含beans.xml文件,则会扫描类以获取CDI注释。