<p>import java.lang.annotation.*;<br/><br/>/<br/> * 元注解 用来标识查询数据库的方法<br/> */<br/>@Documented<br/>@Target(ElementType.METHOD)<br/>@Retention(RetentionPolicy.RUNTIME)<br/>public @interface UseMemCache {<br/><br/> /<br/> * 缓存超时时间控制,> 0 则做超时控制<br/> * @return<br/> */<br/> int expireSeconds() default 30;<br/>}</p><p>=================================================</p><p><br/></p><p><br/></p><p><br/></p><p><br/></p><p><br/></p><p><br/>/<br/> * AOP实现cache缓存处理(缓存到静态对象)<br/> * <br/> * @decr<br/> * @author jlchent<br/> * @date 2018年11月03日<br/> *<br/> */<br/>@Component<br/>@Aspect<br/>public class MemCacheAspect {<br/><br/> private static final Logger logger = LoggerFactory.getLogger(MemCacheAspect.class);<br/><br/> /<br/> * 数据缓存<br/> */<br/> private static Hashtable<String, Object> dataTable = new Hashtable<>();<br/> <br/> /<br/> * 超时控制<br/> */<br/> private static Hashtable<String, Long> timeoutTable = new Hashtable<>();<br/><br/> <br/><br/> /<br/> * 拦截所有元注解cacheCache注解的方法<br/> */<br/> @Pointcut("@annotation(cn.com.framework.annotation.UseMemCache)")<br/> public void pointcutMethod() {<br/> }<br/><br/> <br/> private String saveObjToMem(String cacheKey, Object obj, int expireSeconds){<br/> dataTable.put(cacheKey, obj);<br/><br/> Long expireTime = System.currentTimeMillis() + expireSeconds*1000;<br/> timeoutTable.put(cacheKey, expireTime);<br/> <br/> return "OK";<br/> }<br/> <br/> private String saveObjToMem(String cacheKey, Object obj){<br/> dataTable.put(cacheKey, obj);<br/> return "OK";<br/> }<br/> <br/> private Object getObjFromMem(String cacheKey) {<br/> Long expireTime = timeoutTable.get(cacheKey);<br/> Long currentTime = System.currentTimeMillis();<br/> if (null != expireTime && currentTime > expireTime) {<br/> 过期清空<br/> dataTable.remove(cacheKey);<br/> timeoutTable.remove(cacheKey);<br/> return null;<br/> }else<br/> return dataTable.get(cacheKey);<br/> }<br/> <br/> <br/> /<br/> * 环绕处理,先从cache里获取缓存,查询不到,就通过method查询, 然后再保存到cache缓存里<br/> * <br/> * @param joinPoint<br/> * @return<br/> * @throws Throwable<br/> */<br/> @Around("pointcutMethod()")<br/> public Object around(ProceedingJoinPoint joinPoint) throws Throwable {<br/> 前置:从cache里获取缓存<br/> 先获取目标方法参数<br/> long startTime = System.currentTimeMillis();<br/> Object[] args = joinPoint.getArgs();<br/> String pragrm = "";<br/> if (args != null && args.length > 0) {<br/> for (int i = 0; i < args.length; i++) {<br/> pragrm = "_"+pragrm + String.valueOf(args[i]) ;<br/> }<br/> }<br/> 获取目标方法所在类<br/> String target = joinPoint.getTarget().toString();<br/> String className = target.split("@")[0];<br/> 获取目标方法的方法名称<br/> String methodName = joinPoint.getSignature().getName();<br/> int expireSeconds = 0;<br/> <br/> <br/> try {<br/> Class<?> clz = Class.forName(className);<br/> Class<?>[] classes = null;<br/> if (args != null && args.length > 0) {<br/> classes = new Class[args.length];<br/> for (int i = 0; i < classes.length; i++) {<br/> classes[i] = args[i].getClass();<br/> }<br/> }<br/><br/> Method method = clz.getMethod(methodName, classes);<br/> <br/> <br/> UseMemCache useMemCache = method.getAnnotation(UseMemCache.class);<br/><br/> if (useMemCache != null && useMemCache.expireSeconds() > 0) {<br/> expireSeconds = useMemCache.expireSeconds();<br/> }<br/><br/> } catch (ClassNotFoundException e1) {<br/> e1.printStackTrace();<br/> logger.warn("类包"+className+"不存在", e1);<br/> throw e1;<br/> }<br/><br/> cache中key格式: applId:方法名称<br/> String cacheKey = className + "." + methodName + pragrm;<br/><br/> Object obj = getObjFromMem(cacheKey);<br/> <br/> <br/> if (obj != null) {<br/> <br/> logger.debug("cache的VALUE值类型:" + obj.getClass().getName());<br/> return obj;<br/> }<br/> long endTime = System.currentTimeMillis();<br/> logger.debug("cache缓存AOP处理所用时间(毫秒):" + (endTime - startTime));<br/> logger.info("没有从cache查到数据");<br/><br/> logger.info("开始通过Method查询数据");<br/> obj = joinPoint.proceed();<br/> <br/> if (obj == null) {<br/> logger.info("获取到null数据");<br/> return null;<br/> }<br/> <br/> 后置:将数据库查到的数据保存到cache<br/> String code = "";<br/> if (expireSeconds > 0) {<br/> code = saveObjToMem(cacheKey, obj, expireSeconds);<br/> } else {<br/> code = saveObjToMem(cacheKey, obj);<br/> }<br/> if "OK").equals(code {<br/> logger.info("数据成功保存到cache缓存!!!**");<br/> logger.info("MeM的KEY值:" + cacheKey);<br/> logger.info("cache的VALUE值类型:" + obj.getClass().getName());<br/> }<br/> return obj;<br/> }<br/><br/>}</p>