<p>/<br/>&nbsp;* 元注解 用来标识查询数据库的方法<br/>&nbsp;*/<br/>@Documented<br/>@Target(ElementType.METHOD)<br/>@Retention(RetentionPolicy.RUNTIME)<br/>public @interface UseRedisCache {<br/><br/>&nbsp;&nbsp; &nbsp;/<br/>&nbsp;&nbsp; &nbsp; * 缓存超时时间控制,&gt; 0 则做超时控制<br/>&nbsp;&nbsp; &nbsp; * @return<br/>&nbsp;&nbsp; &nbsp; */<br/>&nbsp;&nbsp; &nbsp;int expireSeconds() default -1;<br/>}</p><p><br/></p><p><br/>import java.lang.reflect.Method;<br/>import org.aspectj.lang.ProceedingJoinPoint;<br/>import org.aspectj.lang.annotation.Around;<br/>import org.aspectj.lang.annotation.Aspect;<br/>import org.aspectj.lang.annotation.Pointcut;<br/>import org.slf4j.Logger;<br/>import org.slf4j.LoggerFactory;<br/>import org.springframework.beans.factory.annotation.Autowired;<br/>import org.springframework.stereotype.Component;<br/><br/>import cn.com.amway.app.client.RedisClient;<br/>import cn.com.amway.app.configuration.ConfTable;<br/>import cn.com.amway.framework.annotation.UseRedisCache;<br/><br/>/<br/>&nbsp;* AOP实现Redis缓存处理<br/>&nbsp;* <br/>&nbsp;* @decr<br/>&nbsp;* @author jlchent<br/>&nbsp;* @date 2018年7月18日<br/>&nbsp;*<br/>&nbsp;*/<br/>@Component<br/>@Aspect<br/>public class RedisAspect {<br/><br/>&nbsp;&nbsp; &nbsp;private static final Logger logger = LoggerFactory.getLogger(RedisAspect.class);<br/><br/>&nbsp;&nbsp; &nbsp;@Autowired<br/>&nbsp;&nbsp; &nbsp;private RedisClient redisCache;<br/><br/>&nbsp;&nbsp; &nbsp;<br/><br/>&nbsp;&nbsp; &nbsp;/<br/>&nbsp;&nbsp; &nbsp; * 拦截所有元注解RedisCache注解的方法<br/>&nbsp;&nbsp; &nbsp; */<br/>&nbsp;&nbsp; &nbsp;@Pointcut(&quot;@annotation(cn.com.framework.annotation.UseRedisCache)&quot;)<br/>&nbsp;&nbsp; &nbsp;public void pointcutMethod() {<br/><br/>&nbsp;&nbsp; &nbsp;}<br/><br/>&nbsp;&nbsp; &nbsp;/<br/>&nbsp;&nbsp; &nbsp; * 环绕处理,先从Redis里获取缓存,查询不到,就通过method查询, 然后再保存到Redis缓存里<br/>&nbsp;&nbsp; &nbsp; * <br/>&nbsp;&nbsp; &nbsp; * @param joinPoint<br/>&nbsp;&nbsp; &nbsp; * @return<br/>&nbsp;&nbsp; &nbsp; * @throws Throwable<br/>&nbsp;&nbsp; &nbsp; */<br/>&nbsp;&nbsp; &nbsp;@Around(&quot;pointcutMethod()&quot;)<br/>&nbsp;&nbsp; &nbsp;public Object around(ProceedingJoinPoint joinPoint) throws Throwable {<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; 前置:从Redis里获取缓存<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; 先获取目标方法参数<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;long startTime = System.currentTimeMillis();<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Object[] args = joinPoint.getArgs();<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String pragrm = &quot;&quot;;<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (args != null &amp;&amp; args.length &gt; 0) {<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for (int i = 0; i &lt; args.length; i++) {<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pragrm = &quot;_&quot;+pragrm + String.valueOf(args[i]) ;<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; 获取目标方法所在类<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String target = joinPoint.getTarget().toString();<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String className = target.split(&quot;@&quot;)[0];<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; 获取目标方法的方法名称<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String methodName = joinPoint.getSignature().getName();<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int expireSeconds = 0;<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Class&lt;?&gt; returnType = Object.class;<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;try {<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Class&lt;?&gt; clz = Class.forName(className);<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Class&lt;?&gt;[] classes = null;<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (args != null &amp;&amp; args.length &gt; 0) {<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;classes = new Class[args.length];<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for (int i = 0; i &lt; classes.length; i++) {<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;classes[i] = args[i].getClass();<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br/><br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Method method = clz.getMethod(methodName, classes);<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;returnType = method.getReturnType();<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;UseRedisCache useRedisCache = method.getAnnotation(UseRedisCache.class);<br/><br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (useRedisCache != null &amp;&amp; useRedisCache.expireSeconds() &gt; 0) {<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;expireSeconds = useRedisCache.expireSeconds();<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br/><br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} catch (ClassNotFoundException e1) {<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; TODO Auto-generated catch block<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;e1.printStackTrace();<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;logger.warn(&quot;类包&quot;+className+&quot;不存在&quot;, e1);<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;throw e1;<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br/><br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; redis中key格式: applId:方法名称<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String redisKey = ConfTable.REDIS_ASPECT_PREFIX + className + &quot;.&quot; + methodName + pragrm;<br/><br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Object obj = (Object)redisCache.getObjFromRedis(redisKey, returnType);<br/><br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (obj != null) {<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;logger.info(&quot;从Redis中查到了数据&quot;);<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;logger.info(&quot;Redis的KEY值:&quot; + redisKey);<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;logger.info(&quot;REDIS的VALUE值类型:&quot; + obj.getClass().getName());<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return obj;<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;long endTime = System.currentTimeMillis();<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;logger.info(&quot;Redis缓存AOP处理所用时间(毫秒):&quot; + (endTime - startTime));<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;logger.info(&quot;没有从Redis查到数据&quot;);<br/><br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;logger.info(&quot;开始通过Method查询数据&quot;);<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;obj = joinPoint.proceed();<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (obj == null) {<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;logger.info(&quot;获取到null数据&quot;);<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return null;<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; 后置:将数据库查到的数据保存到Redis<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String code = &quot;&quot;;<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (expireSeconds &gt; 0) {<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;code = redisCache.saveObjToRedis(redisKey, obj, expireSeconds);<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} else {<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;code = redisCache.saveObjToRedis(redisKey, obj);<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if &quot;OK&quot;).equals(code {<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;logger.info(&quot;数据成功保存到Redis缓存!!!&quot;);<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;logger.info(&quot;Redis的KEY值:&quot; + redisKey);<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;logger.info(&quot;REDIS的VALUE值类型:&quot; + obj.getClass().getName());<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br/>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return obj;<br/>&nbsp;&nbsp; &nbsp;}<br/><br/>}<br/></p>