我有一堆可以根据环境改变的属性(配置)。但是,一旦部署了Web应用程序,这些值就不会更改。因此,我认为在正常的程序流程中,我想要读取很多次的application.properties文件。
我知道我可以在服务器启动时加载这些。但是,对于从后端的简单java类访问这些内容,最好的做法是什么?这些业务类与servlet等无关,并且不依赖于webapp。
所以今天我通过ServletContext加载属性。那又怎样?我应该在哪里保留它们以便其他对象可以轻松访问而无需再次执行fileInputStream.load?
感谢。
答案 0 :(得分:13)
这是一个基本的启动示例:
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