曹工说Spring Boot源码(20)-- 码网灰灰,疏而不漏,如何记录Spring RedisTemplate每次操作日志 (2)

大家可以仔细看上面的代码,利用了前一讲我们学习了的ProxyFactory,来生成代理;使用它呢,比较方便,不用管底层它是用jdk动态代理,还是cglib代理,spring已经帮我们处理好了。

总之,上面这段,就是把redisTemplate给换了。我们具体要在拦截了opsForHash里,做什么动作呢?我们再看。

代理opsForHash的返回结果 @Bean public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String,Object> template = new RedisTemplate<>(); template.setValueSerializer(new CustomGenericJackson2JsonRedisSerializer()); template.setHashKeySerializer(new CustomHashKeyRedisSerializer()); template.setKeySerializer(RedisSerializer.string()); template.setHashValueSerializer(new CustomGenericJackson2JsonRedisSerializer()); template.setConnectionFactory(redisConnectionFactory); ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.setTarget(template); proxyFactory.setProxyTargetClass(true); proxyFactory.addAdvice(new MethodInterceptor() { @Override public Object invoke(MethodInvocation invocation) throws Throwable { boolean b = invocation.getMethod().getName().equals("opsForHash"); if (b) { // 1. 这一步,拿到原有的opsForHash的返回结果 HashOperations hashOperations = (HashOperations) invocation.proceed(); //2. 下边,对hashOperations进行代理 ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.setTarget(hashOperations); proxyFactory.setProxyTargetClass(false); proxyFactory.setInterfaces(HashOperations.class); //3. 我们这个代理干什么事呢,就是加了一个方法前的拦截器,记录日志 proxyFactory.addAdvice(new MethodBeforeAdviceInterceptor(new MethodBeforeAdvice() { // 使用fastjson格式化了参数,并记录到日志 @Override public void before(Method method, Object[] args, Object target) { log.info("method:{},args:{}",method.getName(), JSON.toJSONString(args, SerializerFeature.PrettyFormat)); } })); // 这里返回针对hashOperations的代理 return proxyFactory.getProxy(); } return invocation.proceed(); } }); Object proxy = proxyFactory.getProxy(); return (RedisTemplate<String, Object>) proxy; } 总结

我这个拦截比较粗,现在是把get类的日志也打出来了。大家可以判断下method的名称,来自行过滤掉。

曹工说Spring Boot源码(20)-- 码网灰灰,疏而不漏,如何记录Spring RedisTemplate每次操作日志

ok,本篇先到这里。下讲继续讲Spring ProxyFactory的内容。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdzzw.html