前言:
平时我们进行Spring项目开发的时候,经常需要因为XML的改变而重启服务器,假如项目较大的时候,重启将会非常耗时。最近编写的webschool框架需要用到较多的XML文件进行配置,在这里参考公司代码,实现了对XML文件的热加载。
效果
每次修改xml文件后,Spring都会对xml进行重新读取,自动覆盖原来的bean。
实现思路:
在Spring中建立一个线程不断监控我们导入的xml文件是否已修改,一旦修改,马上重载。
继承扩展XmlWebApplicationContext类
/**
* declaration:
* 扩展Xbean包中的XmlWebApplication类,使之支持热加载。
*
* author wenkangqiang
* date 2016年3月5日
*/
public class XmlRefreshWebApplicationContext extends XmlWebApplicationContext {
public static final String CONFIG_LOCATION_PARAM = "contextConfigLocation";
private static String springClassPathPrefix = "classpath:";
public void reload() {
//重新获得web.xml文件中"contextConfigLocation"参数(被加载的bean目录)
String location = this.getServletContext().getInitParameter(
CONFIG_LOCATION_PARAM);
//通过特定的符号,;\n对参数进行分割,得出各个的路径
String[] locations = StringUtils.tokenizeToStringArray(location,
CONFIG_LOCATION_DELIMITERS);
//获得被修改过的location,然后往下再重新加载那些被修改过的xml文件
List<String> moidifiedLocationList = getModifiedLocation(locations);
if (moidifiedLocationList != null && moidifiedLocationList.size() != 0) {
this.setConfigLocations(StringUtils
.toStringArray(moidifiedLocationList));
doRefresh();
}
}
/**
* 鉴定资源文件(*.xml)是否已经发生更改
* @param locations
* @return
*/
public List<String> getModifiedLocation(String[] locations) {
List<String> refreshLocationList = new ArrayList<Str