在静态块与上下文参数中设置属性文件值

时间:2016-11-03 10:46:42

标签: java static servletcontextlistener

在Java Web应用程序中,我有几个类具有静态方法,这些方法需要存储在属性文件中的某些凭据。

我想知道在属性文件中检索值的首选方法是什么:

  1. 静态阻止 - 在类中有一个static块,从属性文件中读取并将相应的凭据设置为类变量。
  2. 上下文参数 - 从ContextListener中的属性文件中读取并在上下文参数中设置值。
  3. (1)的优点是每次调用时都不必将凭证传递给静态方法,这是多余的。

    (1)的缺点是我多次从相同的属性文件中读取。

    (案例(2)的优点/劣势相反)

2 个答案:

答案 0 :(得分:1)

虽然通常避免使用Singleton模式,但您可以在此处使用它来从任何地方访问您的属性。它也只有不可变状态,所以我认为在这里使用Singleton是可以的:

public final class MyProperties {   
   private final Properties properties;

   private MyProperties(){
       properties = new Properties();
       properties.load(...); // Load your properties here and maybe do some checks
   }

   public static final MyProperties INSTANCE = new MyProperties();

   // Or add some fields/getters instead
   public String getProp(String key){
       return properties.getProperty(key);
   }
}

请注意,此处实例是在启动时创建的,但您也可以在首次需要时懒惰地创建它。这里的优点是,如果找不到属性文件,您将在启动时收到通知。

此外,您可以对此进行扩展,以检查是否包含某些必需属性,否则抛出错误并为属性提供一些getter。

或者你也可以只使用静态初始值设定项初始化的公共静态字段:

public final class MyProperties {   
    public static final String USERNAME;
    // More fields        

    static {
        // Load your properties here and set the fields accordingly
    }

    private MyProperties() {}
}

答案 1 :(得分:0)

静态阻止:仅运行一次的代码块“{}”,并在第一次调用该类的构造函数或main()方法时运行(Sun调用这个'当初始化类时')Reference.

“我多次从相同的属性文件中读取。”。为什么以及如何?