SpElAndAop
导语
在前面我们介绍了 SpEl(Spring Expression Language)解析 与Spring SpEl高级语法, 但是SpEl在时间的开发中能帮助我们做些什么呢?该如何与自己的业务进行匹配呢?本讲将介绍一种使用方式,Aop + SpEl实现日志记录! 主要是通过SpEl实现自定义的记录.Aop大家应该都很熟悉,这里不做过多介绍,如果不是很了解, 可以先阅读Spring Aop 核心概念 ,下面我将进行核心的业务开发。
自定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DemoLog {
String name() default "demo";
String el();
}Aop 实现
@Slf4j
@Aspect
@Component
public class LogAspect {
@Pointcut(value = "@annotation(DemoLog)")
public void logAspect() {
}
/**
* 环绕处理
*
* @param joinPoint
* @throws Throwable
*/
@Around(value = "logAspect()")
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的功能可以让我们的Aop操作更加强大。也可以实现更多的处理,可以是我们的日志更加丰富,项目源代码
Last updated
Was this helpful?