目前我正在使用单例类来读取和加载有属性文件。我在任何想要使用属性值的类中得到了这个实例。
使用静态类而不是可以加载一次(当服务器启动时或某些东西......)而不是使用单例时,这不是更好吗?为什么不呢?
此外,我们如何加载静态类OnServerStart或部署war时。
PS:项目是网络应用程序
答案 0 :(得分:1)
Singleton对于依赖注入和单元测试比静态更好。
您可以将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将是一个具有工厂方法getInstance()
和范围' singleton'的通用bean。
如果您在网络应用中使用Spring,我建议您使用它PropertyPlaceholderConfigurer。
如果您不想使用Spring,并且需要在启动webapp时在servlet上执行某些操作(例如加载属性文件),那么请使用ServletContextListener作为Bhesh Gurung的建议。