有了上面的注解 , 接下来就可以写切面了 。主要代码如下:
/** * OpLog的切面处理类 , 用于通过注解获取日志信息 , 进行日志记录 * @author Hollis */@Aspect@Componentpublic class OpLogAspect { private static final Logger LOGGER = LoggerFactory.getLogger(OpLogAspect.class); @Autowired HttpServletRequest request; @Around("@annotation(com.hollis.annotation.OpLog)") public Object log(ProceedingJoinPoint pjp) throws Exception { Method method = ((MethodSignature)pjp.getSignature()).getMethod(); OpLog opLog = method.getAnnotation(OpLog.class); Object response = null; try { // 目标方法执行 response = pjp.proceed(); } catch (Throwable throwable) { throw new Exception(throwable); } if (StringUtils.isNotEmpty(opLog.opItemIdExpression())) { SpelExpressionParser parser = new SpelExpressionParser(); Expression expression = parser.parseExpression(opLog.opItemIdExpression()); EvaluationContext context = new StandardEvaluationContext(); // 获取参数值 Object[] args = pjp.getArgs(); // 获取运行时参数的名称 LocalVariableTableParameterNameDiscoverer discoverer = new LocalVariableTableParameterNameDiscoverer(); String[] parameterNames = discoverer.getParameterNames(method); // 将参数绑定到context中 if (parameterNames != null) { for (int i = 0; i < parameterNames.length; i++) { context.setVariable(parameterNames[i], args[i]); } } // 将方法的resp当做变量放到context中 , 变量名称为该类名转化为小写字母开头的驼峰形式 if (response != null) { context.setVariable( CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, response.getClass().getSimpleName()), response); } // 解析表达式 , 获取结果 String itemId = String.valueOf(expression.getValue(context)); // 执行日志记录 handle(opLog.opType(), opLog.opItem(), itemId); } return response; } private void handle(OpType opType, String opItem, String opItemId) { // 通过日志打印输出 LOGGER.info("opType = " + opType.name() +",opItem = " +opItem + ",opItemId = " +opItemId); }}
推荐阅读
- 5种茶香5种等级,5种茶绝对不能喝
- macOS 下自定义 应用 app的语言
- 常练太极的人 身体绝对逆天
- 硬盘 几行命令清除移动硬盘GPT保护分区亲测绝对有效
- 小程序自定义动态Tabbar导航栏
- Ingress-nginx自定义配置文件
- 喝茶有5种饮食禁忌,5种茶绝对不能喝
- 利用AOP自定义Redis缓存注解
- 喝茶绝对不能不讲究,喝茶早晚有讲究
- 绝对不要喝的八种茶,禁忌八种不能喝的茶