我有一堆可以根据环境更改的属性(配置)。然而,一旦部署了 Web 应用程序,这些值就不会改变。因此请考虑在正常程序流程中有一个我想多次读取的 application.properties 文件。
我知道我可以在服务器启动时加载这些。然而,就从后端的简单 Java 类访问这些内容而言,最佳实践是什么?这些业务类与 servlet 等无关,也不依赖于 webapp。
所以今天我通过 ServletContext 加载属性。然后呢?我应该把它们放在哪里,以便其他对象可以轻松访问它们,而无需再次执行 fileInputStream.load?
谢谢。
最佳答案
这是一个基本的启动示例:
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/