服务器缓存的概述
使用服务器缓存的好处
缓存:就是存放在内存中的数据
浏览器缓存:浏览器内存中保存的以前的服务器做出的响应
服务器缓存:保存在服务器内存中的数据
服务器缓存通常都保存些什么
一般来讲,服务器缓存就是用来保存数据字典的,因为数据字典数据量大,而且值不是很容易发生变化。(重点是:值不容易发生变化)
总是在实时更新表中的数据,每一次我们使用都要求重新从表中取得最新的数据。而不是从服务器缓存中取得老数据。
处理服务器缓存的最佳时机
使用监听器处理服务器缓存。
监听器作为web开发3大组件(Servlet(controller)、Filter、Listener),是由Tomcat服务器帮我们维护的。
监听器,能够监听域对象的创建与销毁,还能够监听域对象中属性值的创建,更新和移除。
最常用的是监听域对象创建、销毁本身。
你监听什么,我们就是实现哪个所需的监听器
例如:
我们现在拿spring的监听器来举例
public class ContextLoaderListener extends ContextLoader implements ServletContextListener
ContextLoaderListener所实现的是ServletContextListener接口,证明ContextLoaderListener要监听的是上下文(全局域)对象的创建与销毁。
简单来说,监听的就是application域对象的创建与销毁。
contextInitialized:是用来监听application对象创建的方法,
当application对象创建,该监听器就监听到了,立即执行该方法。
contextDestroyed:是用来监听application对象销毁的方法,
当application对象销毁,该监听器就监听到了,立即执行该方法。
以上我们举得例子是监听application,除了application之外,还会有其他的域对象,例如request或者是session,你监听谁,你就必须要实现相应的域对象的接口。
模拟一下spring工厂的创建时机。
我们可以自己创建一个监听器,监听的仍然是application域对象。
将数据字典处理到服务器缓存中的最佳方式:
启动Tomcat服务器,服务器启动之后,服务器会自动的为我们创建一个application对象,当application对象创建完毕后,监听器中的contextInitialized就执行了,我们就可以在这个contextInitialized方法中将所有的数据字典值取出,将他们保存到application域对象中。
将数据字典值保存到application域对象中的过程,就是将数据字典保存到服务器内存中,产生缓存的过程。
关键代码:application.setAttribute(“key”,List dvList);
application对象的生命周期:
创建:服务器启动
销毁:服务器关闭
所谓的服务器缓存其实就是往application域对象中存值。
服务器缓存处理前的问题
- 在监听器中,我们需要使用到数据字典的业务层对象
但是我们不能像以前那样直接以如下形式来使用
//监听器不认识该注解
/@Autowired
private DicService dicService;/
监听器的创建,必须是 Tomcat容器帮我们完成的,而不是spring的IOC帮我们管理创建的
所以使用spring配置监听器,再注入service是不行的
我们需要使用WebApplicationContextUtils工具类,该工具类的作用是获取到spring容器的引用,进而获取到我们需要的bean实例
WebApplicationContextUtils.getWebApplicationContext(application).getBean(DicService.class); - 注意:配置的上下顺序
Spring提供监听器配置在上方 先由spring容器创建好service
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
我们自定义的监听器配置在下方 再由tomcat容器引用service对象
<listener>
<listener-class>com.bjpowernode.crm.web.listener.SysInitListener</listener-class>
</listener>
服务器缓存处理
1.监听器关键代码实现:
@Override
public void contextInitialized(ServletContextEvent event) {
//创建全局作用域对象
ServletContext application = event.getServletContext();
//取得service对象
DicService dicService = WebApplicationContextUtils.getWebApplicationContext(application).getBean(DicService.class);
Map<String, List<DicValue>> map = dicService.getAll();
Set<String> set = map.keySet();
for(String key:set){
//将值放在全局作用对象中
application.setAttribute(key,map.get(key));
}
}
2.业务层关键代码实现
@Override
public Map<String, List<DicValue>> getAll() {
List<DicType> dtList = dicTypeDao.getTypeList();
Map<String, List<DicValue>> map = new HashMap<>();
for(DicType dt:dtList){
String code = dt.getCode();
List<DicValue> dvList = dicValueDao.getValueListByCode(code);
map.put(code+"List",dvList);
}
return map;
}
来源:CSDN
作者:ljf8838
链接:https://blog.csdn.net/ljf12138/article/details/103296899