接口
@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()});
}
}
原文:https://www.cnblogs.com/Jomini/p/13695193.html