我有很多可以随环境变化的属性(配置)。但是,一旦部署了Web应用程序,这些值就不会更改。因此请考虑有一个application.properties文件,我想在正常程序流程中多次读取该文件。
我知道我可以在服务器启动时加载它们。但是,从后端的简单java类访问这些最佳实践是什么?这些业务类与servlet等无关,并且与Web应用程序无关。
所以今天我通过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
并且您可以按如下所示在您的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
?)。
将您的配置类/属性放入jar文件,并将该jar文件放入WEB-INF / lib。然后,您可以通过Web应用程序中所需的任何位置,通过常规的classpath资源设施来访问它们。
您应该对这些属性有一个静态引用,并以这种方式访问它们。您最终将它们读入内存一次,然后保存在内存中。这样,您将不需要在运行时访问磁盘那么多次。
因此,假设您有一个班级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
如果您的应用服务器支持JNDI,则可以使用它。
在这里查看我的问题(和答案):String myProp = AppProperties.getProperties().getProperty("myProp");