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

标签 java static servletcontextlistener

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

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

  1. 静态 block - 在类中有一个static block ,它从属性文件中读取并将适当的凭据设置为类变量。
  2. 上下文参数 - 从 ContextListener 中的属性文件读取并在上下文参数中设置值。

(1) 的优点是我不必每次调用静态方法时都将凭据传递到静态方法中,这是多余的。

(1) 的缺点是我要多次读取同一个属性文件。

(情况(2)的优点/缺点相反)

最佳答案

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

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)静态字段,如下所示:

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

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

    private MyProperties() {}
}

关于java - 在静态 block 与上下文参数中设置属性文件值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40399534/

相关文章:

java - ServletContextListener 正在停止在 Apache Tomcat 上部署 Web 应用程序

java - 这个类应该位于 JSP Web 应用程序的 ServletContext 或 session 范围内吗?

java - 观看 Service Java - 后台两个并行线程

java - 来自android中月份数字的月份名称

java - 如何将列表从类(class)传递到 Activity ?

c++ - 使用内联函数定义静态二维数组

Java MVC 数据库 Controller 类

java - 当其中一个 float 结果为 NaN 时,我可以让 Java 在 float 之间进行比较时抛出异常吗?

java - 使用jpa持久化对象的问题

java - 为什么编译器会提示 illegal start of expression 错误消息?