在web开发中,经常将一些配置的东西单独放到一个配置文件里,但是有一个问题就是当我们将项目部署到正式环境上之后,再想修改一些配置东西那该怎么办,总不能关掉服务器,修改完之后再重新部署吧,这样肯定是不行的。因此我们需要动态的去加载配置文件了。
1.编写一个监听器类,实现ServletContextListener接口。
public class ServiceListener extends HttpServlet implements ServletContextListener {
private static final long serialVersionUID = -4257209167303908356L;
private Logger logger = Logger.getLogger(ServiceListener.class.getName());
@Override
public void contextInitialized(ServletContextEvent event) {
logger.debug("ServiceListener context init.");
ServiceController.getInstance().init();
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
logger.debug("ServiceListener context destroy.");
}
}
ServletContextListener它能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期。
当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由ServletContextListener 来处理。
在 ServletContextListener 接口中定义了处理ServletContextEvent 事件的两个方法。
①contextInitialized(ServletContextEvent sce)
当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化,
并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。
②contextDestroyed(ServletContextEvent sce)
当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet 和Filter 过滤器。
2.在contextinitialized方法中去执行加载配置文件的逻辑。
public class ServiceController {
private static ServiceController instance;
private ServiceController() {
cacheManager = new CacheManager();
}
public static ServiceController getInstance() {
synchronized (ServiceController.class) {
if (null == instance) {
instance = new ServiceController();
}
}
return instance;
}
//配置文件初始化
public void init() {
SystemConfig.init();
ErrorMsgConfig.init();
}
}
3.配置文件动态加载
public class SystemConfig {
private static final String PROP_FILE = "system.properties";
private static PropertiesConfiguration propconfig = null;
public static String getString(String key) {
return propconfig.getString(key);
}
public static boolean getBoolean(String key) {
return propconfig.getBoolean(key);
}
public static int getInt(String key) {
return propconfig.getInt(key);
}
public static void init() {
try {
//使用Apache下的commons-configuration包下的PropertiesConfiguration创建实例
propconfig = new PropertiesConfiguration(PROP_FILE);
propconfig.setEncoding(Constant.DEFAULT_ENCODING);
//设置reload策略,这里用当文件被修改之后reload(默认5s中检测一次)
propconfig.setReloadingStrategy(new FileChangedReloadingStrategy());
} catch (Exception e) {
ExceptionUtil.printStackTrace(e);
}
}
这样就达到在web容器启动的时候去加载配置文件,当配置文件修改之后自动的去加载配置文件。