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

问题描述 投票:8回答:5

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

我知道我可以在服务器启动时加载它们。但是,从后端的简单java类访问这些最佳实践是什么?这些业务类与servlet等无关,并且与Web应用程序无关。

所以今天我通过ServletContext加载属性。那呢我应该在哪里保存它们,以便其他对象可以轻松访问而不必再次执行fileInputStream.load?

谢谢。

java servlets properties
5个回答
13
投票

实施ServletContextListener

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

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

并且您可以按如下所示在您的servlet中进行访问:

<listener>
    <listener-class>com.example.Config</listener-class>
</listener>

经过深思熟虑,这些属性因此100%是特定于业务层的,而不是特定于Web应用程序本身的?那么Config config = Config.getInstance(getServletContext()); String property = config.getProperty("somekey"); 确实笨拙且耦合太紧。只需为业务层提供自己的ServletContextListener类,该类就可以从类路径中加载属性并将其缓存在某些Config变量中(也许是static?)。


1
投票

将您的配置类/属性放入jar文件,并将该jar文件放入WEB-INF / lib。然后,您可以通过Web应用程序中所需的任何位置,通过常规的classpath资源设施来访问它们。


1
投票

您应该对这些属性有一个静态引用,并以这种方式访问​​它们。您最终将它们读入内存一次,然后保存在内存中。这样,您将不需要在运行时访问磁盘那么多次。

因此,假设您有一个班级Map<String, Properties>

AppProperties

从初始化程序Servlet中,您将调用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; } } 从磁盘读取属性。然后,在您的应用程序代码中,访问属性:

loadProperties

0
投票

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

在这里查看我的问题(和答案):String myProp = AppProperties.getProperties().getProperty("myProp");


0
投票

我认为当我们可以非常简单地执行以下操作时,不建议使用其他方法:

Spring deployment-level configuration

非常简单,但我认为这是最好的方法!!享受

© www.soinside.com 2019 - 2024. All rights reserved.