在研究了JSP和Servlets一段时间之后,我开始使用JSF进行Web开发。
当你创建一个JSF Web应用程序时,你总是(可能经常但我不确定它是否总是这样)必须创建beans.xml而你不会在其中写任何东西。但是,如果该文件不存在,JSF Web应用程序将无法运行。
背后的原因是什么?
为什么我们需要该文件?
请详细说明。
答案 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具有例如以下优点:
非常不幸的是,在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注释。