2011-11-14 23 views
2

在其中一個要求中,我們必須通過Web應用程序提供某些屬性,以便我們可以在下拉列表中顯示它們,因此我們只有少數選項 我們正計劃創建一個實用程序類,其中包含一些靜態字段,這些字段將在應用程序啓動時或在該列表的第一個請求到達時分配值。 理念是讀取屬性文件並創建一個List<String>並將其分配到靜態字段,以便當過有人需要訪問這一切,他/她需要以下調用初始化靜態字段可在整個應用程序中使用

GeneralUtil.getList() 

由於我們在工作Web的應用程序一個選擇是創建一個聽者像

public final class MyListener 
    implements ServletContextListener { 

} 

,比讀了contextInitialized方法的屬性文件和讀取值分配給靜態字段,以便他們將在啓動後可用。

另一種選擇是 創建內部GeneralUtil類的靜態塊,並把文件讀邏輯靜態塊內,這樣一旦被cotainer加載的類的靜態字段將被初始化,我們不需要加載它的後續請求。

我的問題是哪些應該是首選方法,以及是否有其他最佳方法來實現此目的。我想避免將列表放置在ApplicationContext或任何此類方法中。

+1

爲什麼你不想把它放在'ApplicationContext'? –

+0

@JigarJoshiThis讓我更少地依賴於上下文,以及如何上下文工作。讓我的應用程序少麻煩的移動,如果我因爲某種原因 –

回答

4

我會用ServletContextListener方法和你的財產訪問器。它看起來比靜態初始化塊更清潔,更直觀。

如果將來想要將初始化邏輯分成幾種方法,我會發現它也更容易。在具有明確責任的單獨班級中,比在一些「通用的上帝類班」中更容易做到(並且閱讀!)。

如果你僅限於Servlets,我認爲這是最好的和最簡單的解決方案。

但是,如果您使用的是EJB,那麼您可以使用@Singleton EJB與@Startup。如果您正在使用CDI,則可以使用@ApplicationScoped CDI bean。

HTH。

+0

+1你點seperatin初始化邏輯 –

2

而不是讀取contextInitialized方法上的屬性文件,並將讀取的值賦給靜態字段,以便它們在啓動後可用。

而是靜態變量,將創建List<String>servletContext對象在contextInitialized(ServletContextEvent sce)方法

需要注意的是,你可以從ServletContextEvent檢索servletContext對象。

+0

將剛剛加上我的代碼以ServletContext中,隨時隨地我得depedent與上下文本身 –

1

靜態解決方案將意味着ThreadLocal並使用序列化。

應用程序範圍的bean(是的,可能最好放在ApplicationContext中)會最有意義。你仍然可以用一種GeneralUtil包裝器來包裝它。 Piotr Nowicki的解決方案是最好的。

我想你不想聽到這個解決方案。

+0

的未來需要我我不知道究竟你的意思是「靜態的解決方案將意味着ThreadLocal的使用和系列化。 」 –

0

我已經使用了一個ServletContextListener類似的用例,它工作得很好。我認爲這是最簡單和最直接的解決方案。只需通過setAttribute(name, object)將屬性放入ServletContext中,並通過getAttribute(name)將它們檢索到應用程序中的任何位置。

+1

我不會喜歡把它們放在ServletContext中把它們意味着使我的應用程序與上下文吞吐量 –

1

爲什麼你不想在ApplicationContext中添加這些值?這是有道理的,因爲它對於整個應用程序來說是相同的?

在你提到的兩個選項中,最好在MyListener中加載這些屬性而不是靜態塊,推理如果你的加載失敗,你的GeneralUtil類將不會被加載,除非你專門捕獲異常並忽略它,這意味着應用程序不能被使用。

+0

+1爲異常綁不知何故事情。我忽略that.Thanks爲puting這一點 –

+0

:)計數器移動從0到有用的答案1;) – mprabhat

+0

我忘了那:)做! –