Java 加载静态属性文件类

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

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

使用一个可以加载一次的静态类(当服务器启动或其他时候)而不是使用单例,不是更好吗?为什么,为什么不

此外,我们如何在ServerStart或部署war时加载静态类


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应用程序中使用的少数属性的列表,然后使用单例。以后进行重构会更容易,但仍然很想知道你在回答中说了些什么。。如果你不介意详细解释一下的话