Web应用程序的配置文件 - 加载一次并存储在哪里?

时间:2010-06-30 21:59:05

标签: java servlets properties

我有一堆可以根据环境改变的属性(配置)。但是,一旦部署了Web应用程序,这些值就不会更改。因此,我认为在正常的程序流程中,我想要读取很多次的application.properties文件。

我知道我可以在服务器启动时加载这些。但是,对于从后端的简单java类访问这些内容,最好的做法是什么?这些业务类与servlet等无关,并且不依赖于webapp。

所以今天我通过ServletContext加载属性。那又怎样?我应该在哪里保留它们以便其他对象可以轻松访问而无需再次执行fileInputStream.load?

感谢。

4 个答案:

答案 0 :(得分:13)

实施ServletContextListener

这是一个基本的启动示例:

public class Config implements ServletContextListener {
    private static final String ATTRIBUTE_NAME = "config";
    private Properties config = new Properties();

    @Override
    public void contextInitialized(ServletContextEvent event) {
        try {
            config.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties"));
        } catch (IOException e) {
            throw new SomeRuntimeException("Loading config failed", e);
        }
        event.getServletContext().setAttribute(ATTRIBUTE_NAME, this);
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        // NOOP.
    }

    public static Config getInstance(ServletContext context) {
        return (Config) context.getAttribute(ATTRIBUTE_NAME);
    }

    public String getProperty(String key) {
        return config.getProperty(key);
    }
}

您在web.xml

中注册如下
<listener>
    <listener-class>com.example.Config</listener-class>
</listener>

您可以在servlet中访问,如下所示:

Config config = Config.getInstance(getServletContext());
String property = config.getProperty("somekey");

在第二次考虑后,这些属性因此100%特定于业务层,而不是Web应用程序本身?然后ServletContextListener确实笨拙而且太紧。只需为业务层提供自己的Config类,该类从类路径加载属性并将其缓存在某个static变量中(可能是Map<String, Properties>?)。

答案 1 :(得分:1)

您应该对这些属性有静态引用,并以这种方式访问​​它们。你最终会将它们读入记忆中并将它们保存在那里。这样,您就不必在运行时多次访问磁盘。

所以,假设你有一个班级AppProperties

public class AppProperties {
  private static Properties props;

  protected static loadProperties(File propsFile) {
    ... read from disk, and set props static member ...
  }

  public static getProperties() {
    return props;
  }
}

从初始化servlet,您可以调用loadProperties从磁盘读取属性。然后,在您的应用程序代码中,访问属性:

String myProp = AppProperties.getProperties().getProperty("myProp");

答案 2 :(得分:1)

将配置类/属性放在jar文件中,并将该jar文件放在WEB-INF / lib中。然后,您可以通过Web应用程序中需要的普通类路径资源工具访问它们。

答案 3 :(得分:0)

如果您的应用服务器支持,您可以使用JNDI。

在这里查看我的问题(和答案):Spring deployment-level configuration