目前我正在使用单例类来读取和加载属性文件。我在任何想要使用属性值的类中都会得到一个这样的实例。
使用静态类代替它可以加载一次(当服务器启动或其他东西时..)而不是使用单例不是更好吗?为什么和为什么不呢?
此外,我们如何在 OnServerStart 或 war 部署时加载静态类。
PS:项目是Web应用程序
最佳答案
单例比静态更适合依赖注入(inject)和单元测试。
您可以将单例类的实例或该类型的模拟注入(inject)到任何其他正在测试的类中。
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 框架,例如 Spring ,用于连接 bean 。 PropertiesHolder 将是一个具有工厂方法 getInstance()
和作用域“singleton”的通用 bean。
如果您在 Web 应用程序中使用 Spring,我建议使用它的 PropertyPlaceholderConfigurer .
如果您不想为此使用 Spring 并且需要在 webapp 启动时在 servlet 上执行一些操作(例如加载属性文件),则使用 ServletContextListener正如 Bhesh Gurung 所建议的那样。
关于java - 加载静态属性文件类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22672333/