14web启动将数据加载到内存中

来源:互联网 发布:传奇当年有多火 知乎 编辑:程序博客网 时间:2024/05/05 18:38
这里用到了Servlet的listener,首先我们在web.xml中配置这个listener,如下所示:
<listener>
<listener-class>pub.LoadInMemory</listener-class>
</listener>
LoadInMemory.java是一个listener,将调用loadInfo.java将数据加载到内存中。它的内容如下:
package pub;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.springframework.web.context.support.WebApplicationContextUtils;


public class LoadInMemory implements ServletContextListener{
 
public void contextInitialized(ServletContextEvent event) {


ServletContext servletContext = event.getServletContext();
        //得到LoadInfo对象
        manage.memory.LoadInfo load=this.loadInfo(servletContext);
        //调用LoadInfo的init()方法
        load.init();
}
public void contextDestroyed(ServletContextEvent event) {

}
   protected manage.memory.LoadInfo loadInfo(ServletContext servletContext)
   {
           //从Spring中得到LoadInfo这个Bean的对象。
       return (manage.memory.LoadInfo) WebApplicationContextUtils.getWebApplicationContext(servletContext).getBean("loadInfo");
   }
}






LoadInfo.java用于把从数据库中查询到得数据放到内存Map中。
package manage.memory;
import java.util.HashMap;
import java.util.Map;
import manage.iface.facade.IDgzzUserFacade;
import manage.vo.dgzzUserVo;
import org.springframework.stereotype.Component;
//将LoadInfo放进Spring中,由Spring管理这个bean
@Component 
public class LoadInfo {
private IDgzzUserFacade dgzzUserFacade;
        //infoMap中存放着我们从数据库得到数据
public static Map infoMap;
private dgzzUserVo uservo;

private LoadInfo(){

}
//在init()方法中,dgzzUserFacade.selectUserById(100);从数据库中查到数据然后把数据存放到infoMap中
public void init(){
infoMap=new HashMap();
uservo=dgzzUserFacade.selectUserById(100);
infoMap.put("user", uservo);
}


public IDgzzUserFacade getDgzzUserFacade() {
return dgzzUserFacade;
}


public void setDgzzUserFacade(IDgzzUserFacade dgzzUserFacade) {
this.dgzzUserFacade = dgzzUserFacade;
}
}


经过上面的步骤我们完成了在Web服务器启动时将某些要用到的数据放进内存中。下面是从infoMap中读取数据:
public void readMemory(){
dgzzUserVo uservo=(dgzzUserVo)LoadInfo.infoMap.get("user");
JSONObject jsonobj=JSONObject.fromObject(uservo);
System.out.println(jsonobj.toString());
}


刷新内存的页面refresh.jsp:
  <body>
    <%
        HttpSession httpSession = request.getSession();
        LoadBaseInfo loadBaseInfo = (manage.memory.LoadInfo) WebApplicationContextUtils.getWebApplicationContext(servletContext).getBean("loadInfo");
        loadBaseInfo.init();
        out.print("内存刷新成功!!!");
    %>
  </body>




如何得到WebApplicationContext
当 Web 应用集成 Spring 容器后,代表 Spring 容器的WebApplicationContext对象将以
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 为键存放在ServletContext的属性列表中。您当然可以直接通过以下语句获取 WebApplicationContext:


WebApplicationContext wac = (WebApplicationContext)servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);


但通过位于 org.springframework.web.context.support 包中的WebApplicationContextUtils 工具类获取 WebApplicationContext 更方便:
WebApplicationContext wac =WebApplicationContextUtils.getWebApplicationContext(servletContext);


当 ServletContext 属性列表中不存在 WebApplicationContext 时,getWebApplicationContext() 方法不会抛出异常,它简单地返回 null。如果后续代码直接访问返回的结果将引发一个 NullPointerException 异常,而 WebApplicationContextUtils 另一个 getRequiredWebApplicationContext(ServletContext sc) 方法要求 ServletContext 属性列表中一定要包含一个有效的 WebApplicationContext 对象,否则马上抛出一个 IllegalStateException 异常。我们推荐使用后者,因为它能提前发现错误的时间,强制开发者搭建好必备的基础设施。
然后调用WebApplicationContext.getBean("beanName")来获得对象的引用,这实际上是使用了依赖查找来获得对象,





0 0
原创粉丝点击