SpEl 实现自定义日志记录
Java有货
共 3699字,需浏览 8分钟
· 2021-07-29
在前面我们介绍了SpEl(Spring Expression Language)解析与Spring SpEl高级语法,但是SpEl在时间的开发中能帮助我们做些什么呢?该如何与自己的业务进行匹配呢?本讲将介绍一种使用方式,Aop + SpEl实现日志记录!主要是通过SpEl实现自定义的记录.Aop大家应该都很熟悉,这里不做过多介绍,如果不是很了解,可以先阅读Spring Aop 核心概念 ,下面我将进行核心的业务开发。
自定义注解
我们将自定义一个注解,用与拦截
(ElementType.METHOD)
(RetentionPolicy.RUNTIME)
public DemoLog {
String name() default "demo";
String el();
}
Aop 实现
这里我们采用@Around的方式,在方法前进行监听,与发生异常时进行监听
4j
public class LogAspect {
"@annotation(DemoLog)") (value =
public void logAspect() {
}
/**
* 环绕处理
*
* @param joinPoint
* @throws Throwable
*/
"logAspect()") (value =
public Object getAroundLog(ProceedingJoinPoint joinPoint) throws Throwable {
Object proceed;
try {
//前置处理
saveLogAspect(joinPoint, null);
proceed = joinPoint.proceed();
return proceed;
} catch (Throwable throwable) {
saveLogAspect(joinPoint, throwable);
throw new RuntimeException(throwable.getMessage());
}
}
private void saveLogAspect(JoinPoint joinPoint, Throwable throwable) {
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
try {
// 获取自定义注解
DemoLog demoLog = methodSignature.getMethod().getAnnotation(DemoLog.class);
if (Objects.nonNull(demoLog)) {
Object spEl = AspectExpress.getSpEl(joinPoint, methodSignature, demoLog.el(), Object.class);
if (log.isInfoEnabled()) {
log.info(" SpelLog {}", spEl);
}
}
} catch (Exception e) {
log.error(e.getMessage());
}
}
}
自定义 SpEl解析器
我们通过自定义SpEL解析的方式实现
public class AspectExpress {
public static <T> T getSpEl(JoinPoint joinPoint, MethodSignature methodSignature, String el, Class<T> clazz){
EvaluationContext context = getContext(joinPoint.getArgs(), methodSignature.getMethod());
return getValue(context, el, clazz);
}
/**
* 获取spel 定义的参数值
*
* @param context 参数容器
* @param key key
* @param clazz 需要返回的类型
* @param <T> 返回泛型
* @return 参数值
*/
private static <T> T getValue(EvaluationContext context, String key, Class<T> clazz) {
SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
Expression expression = spelExpressionParser.parseExpression(key);
return expression.getValue(context, clazz);
}
/**
* 获取参数容器
*
* @param arguments 方法的参数列表
* @param signatureMethod 被执行的方法体
* @return 装载参数的容器
*/
private static EvaluationContext getContext(Object[] arguments, Method signatureMethod) {
String[] parameterNames = new LocalVariableTableParameterNameDiscoverer().getParameterNames(signatureMethod);
if (parameterNames == null) {
throw new RuntimeException("参数列表不能为null");
}
EvaluationContext context = new StandardEvaluationContext();
for (int i = 0; i < arguments.length; i++) {
context.setVariable(parameterNames[i], arguments[i]);
}
return context;
}
}
使用方式
public class SpElDemo {
public void get( Integer id){
}
public void get(SecurityProperties.User user){
}
}
加上以SpEl的功能可以让我们的Aop操作更加强大。也可以实现更多的处理,可以是我们的日志更加丰富
评论
用 Shader 实现旗帜飘扬动画效果
我觉得对于刚入门 3D 编程的朋友来说,如果能够完成代码创建模型数据->创建材质->编写Shader动画这一系列,想必会有满满的成就感。今天就用 Cocos Creator 的 utils.MeshUtils.createMesh 接口,带大家感受一下这个流程。这个流程不仅可以用于新手学
COCOS
2
SpringBoot+Minio实现上传凭证、分片上传、秒传和断点续传
关注我们,设为星标,每天7:40不见不散,架构路上与您共享回复架构师获取资源大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。Spring Boot整合Minio后,前端的文件上传有两种方式:1、文件上传到后端,由后端保存到Minio这种方式好处是完全由后端集中管理,可以很好的做到、身份验证、
Java架构师社区
0
超越原生,散点图实现华夫饼图
之前我们介绍过了如何使用新卡片图实现华夫饼图。参考:超越原生,PowerBI 华夫饼图实现但是利用卡片图实现的华夫饼图有一些缺点,形状之间的大小跟间距不太好把握,而且有时形状大一点的话显示就会不正常,需要做出二次调整。今天给大家介绍一种原生视觉对象生成华夫饼图的更佳方案,既简单又美观。上图是利用散点
PowerBI战友联盟
2
Spring Boot + flowable 快速实现工作流
关注我们,设为星标,每天7:40不见不散,架构路上与您共享回复架构师获取资源大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。来源:blog.csdn.net/zhan107876/article/details/120815560总览一、flowable-ui部署运行二、绘制流程图绘图细节:
Java架构师社区
0
实现订单30分钟自动取消的策略
原文:juejin.cn/post/7285167401821798400简介在电商和其他涉及到在线支付的应用中,通常需要实现一个功能:如果用户在生成订单后的一定时间内未完成支付,系统将自动取消该订单。本文将详细介绍基于Spring Boot框架实现订单30分钟内未支付自动取消的几种方案,并提供实例
JAVA乐园
0
AI大模型之路 第三篇:从零实现词嵌入模型,加深理解!
你好,我是郭震今天我们研究「AI大模型第三篇」:词维度预测,很多读者听过词嵌入,这篇文章解答下面问题:词嵌入是什么意思?怎么做到的?原理是什么?从零实现一个专属你数据集的词嵌入我们完整从零走一遍,根基的东西要理解透,这样才能发明出更好的东西。1 skip-gram模型Skip-gram模型是一种广泛
Python与算法社区
11
面试官:谈谈前端路由的实现原理【hash&history】
哈喽,大家好我是考拉🐨。今天我们来聊一聊前端路由。当谈到前端路由时,指的是在前端应用中管理页面导航和URL的机制。前端路由使得单页应用(Single-Page Application,SPA)能够在用户与应用交互时动态地加载不同的视图,而无需每次都重新加载整个页面。在前端开发中,常用的前端路由库有很
程序员成长指北
10
从理解路由到实现一套Router(路由)
大厂技术 高级前端 Node进阶点击上方 程序员成长指北,关注公众号回复1,加入高级Node交流群平时在Vue项目中经常用到路由,但是也仅仅处于会用的层面,很多基础知识并不是真正的理解。于是就趁着十一”小长假“查阅了很多资料,总结下路由相关的知识
程序员成长指北
347