我似乎無法找到強制應用程序範圍的託管bean在Web應用程序啓動時實例化/初始化的方法。看起來應用程序範圍的bean在第一次訪問bean的時候得到了延遲實例化,而不是在Web應用程序啓動的時候。對於我的Web應用程序,第一個用戶第一次在Web應用程序中打開一個頁面時會發生這種情況。如何強制應用程序範圍的bean在應用程序啓動時實例化?
我想避免這種情況的原因是因爲在初始化我的應用程序範圍的bean期間發生了大量耗時的數據庫操作。它必須從持久存儲中檢索一堆數據,然後緩存一些以ListItem元素等形式經常顯示給用戶的數據。我不想在第一個用戶連接時發生這種情況,因此導致很長的延遲。
我的第一個想法是使用舊式的ServletContextListener contextInitialized()方法,並從那裏使用ELResolver手動請求託管bean的實例(從而強制執行初始化)。不幸的是,我不能在這個階段使用ELResolver觸發初始化,因爲ELResolver需要一個FacesContext,並且FacesContext僅在請求的生命週期中存在。
有誰知道一個替代方法來完成這個?
我使用MyFaces 1.2作爲JSF實現,此時無法升級到2.x。
+1有效的解決方案。一個小問題:根據規範做這件事是正式的,還是依賴於一些JSF實現細節?我的意思是,JSF實現可以決定跟蹤應用程序bean是否以完全不明顯的方式實例化,然後重新創建bean。 – ewernli 2010-08-30 13:40:50
@BalusC這是如此簡單,它的工作原理。我曾經避免在ServletContext中使用setAttribute()方法,因爲我認爲它會干擾JSF,但顯然不是。 PS:在blogspot.com上愛你的頁面 - 關於使用DataTables的舊文章很有幫助。 – 2010-08-30 13:45:11
@Jim:不客氣。 @ewernli:規範沒有明確允許,但它也沒有明確禁止。然而,規範描述瞭如果託管bean不在範圍中,則必須創建託管bean。 – BalusC 2010-08-30 14:02:02