接口
@Component @Aspect public class CacheAspect { @Autowired private RedisTemplate redisTemplate; @Pointcut("@annotation(com.jm.cache.redis.annotation.NeteaseCache)") public void cachePointcut() { } // 定义相应的事件 @Around("cachePointcut()") public Object doCache(ProceedingJoinPoint joinPoint) { Object value = null; try { // 0-1、 当前方法上注解的内容 MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = joinPoint.getTarget().getClass().getMethod(signature.getName(), signature.getMethod().getParameterTypes()); NeteaseCache cacheAnnotation = method.getAnnotation(NeteaseCache.class); String keyEl = cacheAnnotation.key(); String prefix = cacheAnnotation.value(); // 0-2、 前提条件:拿到作为key的依据 - 解析springEL表达式 // 创建解析器 SpelExpressionParser parser = new SpelExpressionParser(); Expression expression = parser.parseExpression(keyEl); EvaluationContext context = new StandardEvaluationContext(); // 参数 // 添加参数 Object[] args = joinPoint.getArgs(); DefaultParameterNameDiscoverer discover = new DefaultParameterNameDiscoverer(); String[] parameterNames = discover.getParameterNames(method); for (int i = 0; i < parameterNames.length; i++) { context.setVariable(parameterNames[i], args[i].toString()); } // 解析 String key = prefix + "::" + expression.getValue(context).toString(); // 1、 判定缓存中是否存在 value = redisTemplate.opsForValue().get(key); if (value != null) { System.out.println("从缓存中读取到值:" + value); return value; } // 2、不存在则执行方法 value = joinPoint.proceed(); // 3、 同步存储value到缓存。 redisTemplate.opsForValue().set(key, value); } catch (Throwable throwable) { throwable.printStackTrace(); } return value; } }
sevice
@Service public class UserService { @Autowired JdbcTemplate jdbcTemplate; // spring提供jdbc一个工具(mybastis类似) @Autowired RedisTemplate redisTemplate; /** * 根据ID查询用户信息 (redis缓存,用户信息以json字符串格式存在(序列化)) */ @NeteaseCache(value="user",key="#userId") // 返回值 存到redis public User findUserById(String userId) { System.out.println("查询数据库."); String sql = "select * from tb_user_base where uid=?"; User user = jdbcTemplate.queryForObject(sql, new String[]{userId}, new BeanPropertyRowMapper<>(User.class)); return user; } @CacheEvict(value="user",key="#user.uid") // 方法执行结束,清除缓存 public void updateUser(User user){ String sql = "update tb_user_base set uname=? where uid=?"; jdbcTemplate.update(sql, new String[]{user.getUname(), user.getUid()}); } }