目前我正在使用單例類來讀取和加載屬性文件。我在任何想要使用屬性值的類中獲得此實例。加載靜態屬性文件類
不是使用一個靜態類,而是使用一個可以加載一次(當服務器啓動或什麼的時候)而不是使用單例的靜態類嗎?爲什麼?爲什麼不?
此外,我們如何加載靜態類OnServerStart或戰爭部署時。
PS:項目是Web應用程序
目前我正在使用單例類來讀取和加載屬性文件。我在任何想要使用屬性值的類中獲得此實例。加載靜態屬性文件類
不是使用一個靜態類,而是使用一個可以加載一次(當服務器啓動或什麼的時候)而不是使用單例的靜態類嗎?爲什麼?爲什麼不?
此外,我們如何加載靜態類OnServerStart或戰爭部署時。
PS:項目是Web應用程序
辛格爾頓是依賴注入,比靜態的單元測試更好。
您可以將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建議的那樣。
取決於如何使用這些屬性,爲什麼不使用可以在應用程序範圍內共享的Atomic或volatile變量? –
原子的揮發? – Andy897
在Web應用程序中,您可以使用['ServletContextListener'](http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContextListener.html)。 –