2014-03-26 132 views
0

目前我正在使用單例類來讀取和加載屬性文件。我在任何想要使用屬性值的類中獲得此實例。加載靜態屬性文件類

不是使用一個靜態類,而是使用一個可以加載一次(當服務器啓動或什麼的時候)而不是使用單例的靜態類嗎?爲什麼?爲什麼不?

此外,我們如何加載靜態類OnServerStart或戰爭部署時。

PS:項目是Web應用程序

+0

取決於如何使用這些屬性,爲什麼不使用可以在應用程序範圍內共享的Atomic或volatile變量? –

+0

原子的揮發? – Andy897

+0

在Web應用程序中,您可以使用['ServletContextListener'](http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContextListener.html)。 –

回答

1

辛格爾頓是依賴注入,比靜態的單元測試更好。

您可以將singleton類的實例或該類型的Mock注入到任何其他正在測試的類中。

public class PropertiesHolder { 
    private static final PropertiesHolder INSTANCE = new PropertiesHolder(); 

    private final Properties props; 

    private PropertiesHolder() { 
     props = load(); 
    } 

    public static PropertiesHolder getInstance() { 
     return INSTANCE; 
    } 

    public String getProperty(String key) { 
     return props.getProperty(key); 
    } 

    private Properties load() { 
     ... 
    } 
} 

然後您可以在您的測試嘲笑PropertiesHolder:

@RunWith(MockitoJUnitRunner.class) 
public class MyTest { 

    @Mock private PropertiesHolder holder; 

    @Test 
    public void testSomething() { 
     SomeService service = new SomeService(holder); 

     when(holder.getProperty("foo")).thenReturn("bar"); 

     String result = service.doSomething(); 

     assertEquals(...) 
    } 

} 

對於生產代碼,你可以使用:

new SomeService(PropertiesHolder.getInstance()); 

甚至更​​好,使用DI框架,例如春天,用於連接豆子。 PropertiesHolder將是一個通用bean,其工廠方法爲getInstance(),範圍爲'singleton'。

如果你在你的web應用程序中使用Spring,我建議使用它的PropertyPlaceholderConfigurer

如果您不想使用Spring並且需要在webapp啓動時在servlet上執行一些操作(例如加載屬性文件),那麼可以使用ServletContextListener,如Bhesh Gurung建議的那樣。

+0

我不確定是否完全或完全解決了這個問題。我沒有進入測試世界......所以很難理解你使用過的任何術語。我的屬性文件僅僅是需要跨Web應用程序使用的幾個屬性的列表 – Andy897

+0

然後使用單例。稍後重構會更容易。 –

+0

但仍然好奇,要了解你在答案中說的是什麼......如果你不介意詳細說明一下 – Andy897