不要着迷于技术,应把注意力放到问题上。

  一个普通的后台管理系统,一定会有参数配置。参数配置数据表和其他的数据表是不同的,它的操作基本都是查的操作。参数配置的这些数据信息是贯穿在整个项目中,那么把他们放到哪里可以方便类或者jsp的调用?

spring的配置文件有支持缓存类,它的配置如下:

 <!-- 启用用户的缓存功能 -->
<bean id="userCache" class="org.springframework.security.core.userdetails.cache.EhCacheBasedUserCache">
<property name="cache" ref="userEhCache" />
</bean>
<bean id="userEhCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
<property name="cacheName" value="userCache" />
<property name="cacheManager" ref="ehcacheManager" />
</bean>
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cache-manager-ref="ehcacheManager"/>
<bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:config-location="classpath:config/ehcache.xml"/>

  

然后在我们自己的缓存类中加入相应的注解即可:

package cn.wangze.service;

import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service; import cn.wangze.domain.SysMenu;
import cn.wangze.domain.SysParam;
import cn.wangze.utils.AuthUtils; @Service
public class SysCacheService{ //具体需要缓存的数据视自己业务而定
/**
* 项目中菜单的数据很少变动,所以我们把菜单数据也放到缓存里面
* */
@Autowired
private SysMenuService<SysMenu> sysMenuService; /**
* 注入系统参数的service
* */
@Autowired
private SysParamService<SysParam> SysParamService; /**
* 创建Map对象保存系统参数的数据,方便调用
*/
private Map<String,String> sysParamMap; /**
* 通过调用这个方法可以取到缓存的菜单数据
*/
@Cacheable(value="sysCache",key="methodName")
public List<SysMenu> queryMenuList(){
List <SysMenu> list = sysMenuService.queryList();
if(list == null || list.size() == 0) return null;
AuthUtils.clear();
for(int i=0;i<list.size();i++){
SysMenu m = list.get(i);
AuthUtils.addAuth(m.getId(), m.getUrl());
}
return list;
} /**
* 清除缓存中的某些数据,如果参数type为querySysParamList则全部清空
* */
@CacheEvict(value="sysCache",key="#p0")
public void removeCatch(String type){
if(type.equals("querySysParamList")){
this.sysParamMap = null;
}
} /**
* 清除缓存中的全部数据
* */
@CacheEvict(value="sysCache",allEntries=true)
public void removeAll(){
this.sysParamMap = null;
} /**
* 查看缓存中全部数据
* */
@Cacheable(value="sysCache",key="methodName")
public List<SysParam> querySysParamList(){
return SysParamService.queryList(null);
} /**
* 输入保存的key值,拿到对应的value。这个方法会经常用到。
* */
public String getSysParam(String key){
if(this.sysParamMap == null){
this.sysParamMap = new HashMap<String,String>();
for(SysParam param: querySysParamList()){
sysParamMap.put(param.getKey(), param.getValue());
}
}
return this.sysParamMap.get(key);
} }

  我们的缓存类SysCacheService就算写好了。可以看到第一次我们调用queryMenuList或者getSysParam方法时,如果map为空会从数据库中拿,如果map内部有数据存在,会直接从map拿数据。数据是以键值对的形式保存的。当我们想调用里面的数据时,只需要在操作类中注入SysCacheService,然后调用对应的方法。

举个例子,我的数据结构是这样的:

这是我的项目中的参数配置表,因为以前是oracle数据库,后来我把数据导入到mysql数据库里面时发现字段命名为"key"和"value"的话,查询sql语句会报错,所以换成了"keyaa"和"valueaa"。

MyController类想用一下系统配置的sms_url的值:

public String getSmsUrl(){
String sms_url =sysCacheService.getParam("sms_url");
return sms_url ;
}

在MyController类中注入SysCacheService对象sysCacheService,并调用它的方法,传入参数"sms_url"就ok了。

后来,我想了想有没有更好的办法,把缓存放到一个类似工具类的静态类里面呢,这样就不用每次用到缓存数据都得注入一个SysCacheService了。方法如下:

1.在配置文件中添加一个servlet上下文的监听器,当servlet加载时,把SysCacheService放到静态类里面

2.在静态类中声明方法,代理SysCacheService的方法调用

  xml配置文件增加一个listener:

<!-- 监听器,用于将缓存SysCacheService类封装成静态类 -->
<listener>
<listener-class>
cn.wangze.listener.MyContextListener
</listener-class>
</listener>
MyContextListener代码如下:
package cn.wangze.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; import org.springframework.web.context.support.WebApplicationContextUtils; import cn.wangze.Constants;
import cn.wangze.service.SysCacheService; public class MyContextListener implements ServletContextListener{ @Override
public void contextDestroyed(ServletContextEvent arg0) {
} @Override
public void contextInitialized(ServletContextEvent sce) { ServletContext sc = sce.getServletContext();
SysCacheService sysCacheService = WebApplicationContextUtils.getWebApplicationContext(sc).getBean(SysCacheService.class);
Constants.setSysCacheService(sysCacheService);
}
}

静态类的代码如下:

package cn.wangze;

import cn.wangze.service.SysCacheService;

public class Constants {
private static SysCacheService sysCacheService;
public static SysCacheService getSysCacheService(){
return sysCacheService;
} public static void setSysCacheService(SysCacheService sysCacheService){
Constants.sysCacheService = sysCacheService;
} public static String getParam(String key){
return sysCacheService.getSysParam(key);
}
}

  这样,我们每次用到缓存数据时候,只需要引入Constants静态类,并直接用类名+方法名调用数据就行了。

Java缓存类的实际应用场景的更多相关文章

  1. Java缓存类loadingCache

    <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artif ...

  2. Android公共库(缓存 下拉ListView 下载管理Pro 静默安装 root运行 Java公共类)

    介绍总结的一些android公共库,包含缓存(图片缓存.预取缓存).公共View(下拉及底部加载更多ListView.底部加载更多ScrollView.滑动一页Gallery).及Android常用工 ...

  3. java transient关键字作用,使用场景。

    java transient关键字作用,使用场景. 2016年08月31日 15:31:10 阅读数:4280 transient的作用及使用方法,官方解释为: Variables may be ma ...

  4. Java中的引用类型和使用场景

    作者:Grey 原文地址:Java中的引用类型和使用场景 Java中的引用类型有哪几种? Java中的引用类型分成强引用, 软引用, 弱引用, 虚引用. 强引用 没有引用指向这个对象,垃圾回收会回收 ...

  5. 面试题之java缓存总结,从单机缓存到分布式缓存架构

    1.缓存定义 高速数据存储层,提高程序性能 2.为什么要用缓存(读多写少,高并发) 1.提高读取吞吐量 2.提升应用程序性能 3.降低数据库成本 4.减少后端负载 5.消除数据库热点 6.可预测的性能 ...

  6. 分享个 之前写好的 android 文件流缓存类,专门处理 ArrayList、bean。

    转载麻烦声明出处:http://www.cnblogs.com/linguanh/ 目录: 1,前序 2,作用 3,特点 4,代码 1,前序  在开发过程中,client 和 server 数据交流一 ...

  7. (转)java缓存技术,记录

    http://blog.csdn.net/madun/article/details/8569860 最近再ITEYE上看到关于讨论JAVA缓存技术的帖子比较多,自己不懂,所以上网大概搜了下,找到一篇 ...

  8. JAVA缓存技术

    介绍 JNotify:http://jnotify.sourceforge.net/,通过JNI技术,让Java代码可以实时的监控制定文件夹内文件的变动信息,支持Linux/Windows/MacOS ...

  9. Java 缓存技术

    以下仅是对map对方式讨论.没有对点阵图阵讨论.作缓存要做以下2点:  1:清理及更新缓存时机的处理: . 虚拟机内存不足,清理缓存 .. 缓存时间超时,或访问次数超出, 启动线程更新 2:类和方法的 ...

随机推荐

  1. 灵玖软件NLPIRParser智能文本聚类

    随着互联网的迅猛发展,信息的爆炸式增加,信息超载问题变的越来越严重,信息的更新率也越来越高,用户在信息海洋里查找信息就像大海捞针一样.搜索引擎服务应运而生,在一定程度上满足了用户查找信息的需要.然而互 ...

  2. java对excel表格的上传和下载处理

    Excel表格文件的上传和下载,java中涉及到文件肯定会有io流的知识. 而excel文件就要涉及到poi技术,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为 ...

  3. CI 结合 vue.js 的搜索功能模块

    CI 结合 vue.js 的搜索功能模块 最近在有优化公司后台的某个模块的搜索功能优化 原先的是这个样子的,很是单调: 老大给我找个图希望我能弄成这样子: 经过不断修改,最后成了这样子 是不是比以前好 ...

  4. Python Socket 简单聊天室2

    上篇文章写了一个简单的单线程的一问一答的简单聊天室.这次我们使用SocketServer模块搭建一个多线程异步的聊天室. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

  5. Sublime text 3搭建Python开发环境

    前辈们说的已经很多了,但是自己依旧会出现各种问题,写篇日志记录这次的搭建经验. 1.安装python,我用的是python3.5,可以上官网下载 2.安装Sublime text 3,可以上官网下载 ...

  6. 带有WS-Security验证的webservice

    示例用的是spring+CXF来配置webservice 首先是web.xml配置,将spring,CXF的配置文件加载进去,由于我客户端跟服务端在同一个工程里面,所以配置文件在一块. <con ...

  7. 在linux环境下安装Node

    liunx安装node的方法 cd /usr/src //node 安装的位置   一 : 普通用户: 安装前准备环境: 1.检查Linux 版本 命令: cat /etc/redhat-releas ...

  8. 手动修复IAT

    现在我们已经了解了IAT的的工作原理,现在我们来一起学习手动修复IAT,一方面是深入了解运行过程一方面是为了避免遇到有些阻碍自动修复IAT的壳时不知所措. 首先我们用ESP定律找到加了UPX壳后的OE ...

  9. Redis-入门笔记-15min带你一览redis

            如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各位支持!       少年入门笔记,整理出来一起入坑!入门的视屏 ...

  10. RMAN备份介质的移动与再恢复测试 [ catalog start with ‘dir’ ]

    --RMAN备份介质的移动与再恢复测试 ---------------------------------------------------------2013/09/21   由于目前生产环境中没 ...