gpt4 book ai didi

java - 加载静态属性文件类

转载 作者:行者123 更新时间:2023-12-01 13:13:14 25 4
gpt4 key购买 nike

目前我正在使用单例类来读取和加载属性文件。我在任何想要使用属性值的类中都会得到一个这样的实例。

使用静态类代替它可以加载一次(当服务器启动或其他东西时..)而不是使用单例不是更好吗?为什么和为什么不呢?

此外,我们如何在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com