我在學習JSP和Servlet一段時間後,開始使用JSF進行Web開發。爲什麼在使用JSF Web應用程序時需要beans.xml?
當您創建JSF Web應用程序時,您總是(可能經常但不確定它是否總是)不得不創建beans.xml,並且您不會寫入任何內容。但是,如果該文件不存在,JSF Web應用程序將無法工作。
背後的原因是什麼?
爲什麼我們需要該文件?
請詳細解釋。
我在學習JSP和Servlet一段時間後,開始使用JSF進行Web開發。爲什麼在使用JSF Web應用程序時需要beans.xml?
當您創建JSF Web應用程序時,您總是(可能經常但不確定它是否總是)不得不創建beans.xml,並且您不會寫入任何內容。但是,如果該文件不存在,JSF Web應用程序將無法工作。
背後的原因是什麼?
爲什麼我們需要該文件?
請詳細解釋。
添加到Micheal的答案中;由於注入支持,CDI不僅可以與JSF結合使用,還因爲它支持與EL(表達式語言)一起使用。這是JSF嚴重依賴的一個特性。
實際上,CDI bean幾乎可以完全替代JSF託管的bean,因此您會發現很多使用它們的示例以及大量的JSF書籍,建議使用它們。對於JSF應用程序,CDI bean有例如以下優點:
非常不幸的是,在JSF 2.0和2.1中,默認情況下CDI bean不支持非常方便的視圖範圍,儘管像Seam這樣的擴展可以添加這些範圍。 (更新:在JSF 2.2有,它與CDI豆工作一個新的視圖範圍)
總而言之JSF託管bean和CDI豆的方寸之間是這樣的,有一個爲這個JSF規範的問題,請參見http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-976
beans.xml文件的存在標誌着應用程序使用JSR-299(上下文和依賴注入)的servlet容器 - 沒有它,應用程序的類也不會被CDI註釋掃描,依賴注入也不會執行。如果您不使用CDI(例如,您只使用普通的JSF託管的bean),則不需要beans.xml。如果你這樣做,你可以使用該文件(而不是註釋)來定義CDI配置 - 例如,這允許你提供一個測試配置,其中一些依賴被mock替代。
從Getting Started with Contexts and Dependency Injection and JSF 2.x
當應用程序部署時,服務器將查找CDI受管bean。在Java EE 7應用程序中,默認情況下會掃描路徑上的類以查找CDI註釋。在Java EE 6應用程序中,如果模塊包含beans.xml文件,則會掃描CDI註釋的類。
我真的很感謝你們的幫助。由於我剛剛開始學習JSF,我無法得到依賴和注入的清晰想法(爲什麼需要它們?),CDI bean和託管bean之間的區別。這是因爲我迄今爲止所做的例子不需要依賴和注入。我希望當我瞭解他們時,我將能夠理解你們的回答。 – matiman 2011-05-29 23:11:50
@ user636195:它是「依賴注入」,不是「和」 - 它是一種將依賴關係注入組件的機制,而不是讓組件負責獲取它們需要的東西(依賴關係)的引用。這是一個相當抽象的主題,但主要好處是提高了靈活性。託管bean實際上是一種(有點受限制的)依賴注入形式,一種是從一開始就是JSF的一部分,而CDI則是代表官方標準的更多功能豐富的形式,並不完全與JSF綁定。 – 2011-05-30 08:00:33
CDI bean現在可以在Java EE 7中查看作用域(我認爲需要現在編輯答案)。 – Tiny 2015-04-16 11:10:44