web服务刚启动时SpringMVC注解就加载一定的数据库数据进入内存中

来源: https://blog.csdn.net/xionglangs/article/details/72190252

首先确认需要加载一定的数据库数据进入内存中,就必须要连接数据库,刚开始考虑的办法是在监听中添加查询的方法,但真正执行的时候就会报bean不存在,这是因为你的bean还没有注入,也就是报空指针了,因为web.xml的执行顺序是

context-param>listener>filter>servlet,也就是你在执行监听和过滤器的时候,其实servlet并没有执行,这样就导致你的spring并没有注入,就报空指针了。之后又测试在context-param里面进行spring的初始化,但还是不行,可能是我没配置好;之后想了个办法,直接在监听或是过滤器里面执行,但先去获取JNDI数据源,但是还是报null,说数据源不存在,不知道是哪里没配置好;之后又想了直接用JDBC,这次倒是成功了,但是需要先确定数据库的驱动,还得多配置一份用户名密码,太麻烦了;最后想到了,在servlet里面不仅配置了过滤器,还配置了拦截器,之后在拦截器配置里面实现数据初始化,成功。

效果图:

启动servlet就加载servlet-context.xml

配置初始化数据的拦截器


最后效果


数据放入类的静态Map中,可以直接通过指定的键获取list值,之后用的时候强转为对应的对象就可以了,刷新内存,只要前台一个按钮,点击跳转,路径以initData开头,进入控制层,new个对象,之后调用afterPropertiesSet()方法就可以了。


package com.sunxl.base.interceptor;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.sunxl.base.service.MenusService;
import com.sunxl.base.util.Sql;


/**
 * @author 熊浪
 * @Email [email protected]
 * @Time 2017年5月15日
 * @此类作用:servelet执行完成之后初始化数据
 */
public class InitDataInterceptor extends HandlerInterceptorAdapter implements InitializingBean {
private static Log log = LogFactory.getLog(InitDataInterceptor.class);
public static Map<String, List<?>> map = new HashMap<String, List<?>>();
@Autowired
private MenusService menusService;


@Override
public void afterPropertiesSet() throws Exception {
map.clear();//初始化清空map
loadall();
}


private void loadall() {
try {
loadUser();
} catch (Exception e) {
e.printStackTrace();
log.error("初始化数据出错");
}
}


private void loadUser() {
map.put("menusService", menusService.sarch(new Sql()));
System.out.println(map.size());
}
}

猜你喜欢

转载自blog.csdn.net/rentian1/article/details/80822471