Java 加载静态属性文件类
目前,我正在使用单例类来读取和加载属性文件。在我想要使用属性值的任何类中,我都会得到这个实例 使用一个可以加载一次的静态类(当服务器启动或其他时候)而不是使用单例,不是更好吗?为什么,为什么不 此外,我们如何在ServerStart或部署war时加载静态类Java 加载静态属性文件类,java,unit-testing,properties,dependency-injection,Java,Unit Testing,Properties,Dependency Injection,目前,我正在使用单例类来读取和加载属性文件。在我想要使用属性值的任何类中,我都会得到这个实例 使用一个可以加载一次的静态类(当服务器启动或其他时候)而不是使用单例,不是更好吗?为什么,为什么不 此外,我们如何在ServerStart或部署war时加载静态类 PS:Project is web应用程序对于依赖项注入和单元测试,单例优于静态 您可以将singleton类的实例或该类型的模拟注入任何其他被测试的类 public class PropertiesHolder { private s
PS:Project is web应用程序对于依赖项注入和单元测试,单例优于静态 您可以将singleton类的实例或该类型的模拟注入任何其他被测试的类
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() {
...
}
}
然后,您可以在测试中模拟PropertieShalder:
@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。PropertieShared将是一个具有工厂方法getInstance()
和作用域“singleton”的通用bean
如果您在web应用程序中使用Spring,我建议您使用它的
如果您不想使用Spring,并且需要在webapp启动时在servlet上执行一些操作(例如加载属性文件),那么请按照Bhesh Gurung的建议使用。这取决于属性的使用方式,为什么不使用可在应用程序范围内共享的原子或易失性变量?在web应用程序中,可以使用.ServletContextListener加载属性文件?如何?指定加载属性文件的类。有足够的文档,ServletContextListener将在web.xml中定义。搜索示例,它应该是非常直接的。我不确定我是否完全得到了它,或者根本没有得到它。我不喜欢测试世界。。。所以你几乎不理解你使用过的任何术语。我的属性文件只是一个需要在web应用程序中使用的少数属性的列表,然后使用单例。以后进行重构会更容易,但仍然很想知道你在回答中说了些什么。。如果你不介意详细解释一下的话