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

标签 java servlets properties

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

我知道我可以在服务器启动时加载这些。然而,就从后端的简单 Java 类访问这些内容而言,最佳实践是什么?这些业务类与 servlet 等无关,也不依赖于 webapp。

所以今天我通过 ServletContext 加载属性。然后呢?我应该把它们放在哪里,以便其他对象可以轻松访问它们,而无需再次执行 fileInputStream.load?

谢谢。

最佳答案

实现 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% 特定于业务层,而不是网络应用程序本身?然后一个ServletContextListener确实笨拙且耦合太紧。给业务层自己的Config从类路径加载属性并将其缓存在一些static中的类变量(Map<String, Properties> 也许吧?)。

关于java - Web 应用程序的配置文件 - 加载一次并存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3153739/

相关文章:

java - 在 ScrollView 周围放置黑线边框 - Android

java - Paypal IPN模拟器问题

java - Struts 2中的ActionContext对于当前请求来说是唯一的吗?

iphone - 无法将 NSString 对象复制到我的自定义对象的属性 Objective-c

objective-c - 我想了解何时使用 @property 与实例变量

c++ - 使用混合 C 和 C++ 对函数的 undefined reference

java - 试图找出为什么这两个 SOAP 请求之一不起作用 (java.lang.IllegalArgumentException)

javadoc 从类中排除一些公共(public)方法

java - 如何在Java MIDI程序中更改乐器

java - 如何为一个特定的 servlet 应用过滤器?