SpElAndAop

导语


在前面我们介绍了 SpEl(Spring Expression Language)解析Spring SpEl高级语法, 但是SpEl在时间的开发中能帮助我们做些什么呢?该如何与自己的业务进行匹配呢?本讲将介绍一种使用方式,Aop + SpEl实现日志记录! 主要是通过SpEl实现自定义的记录.Aop大家应该都很熟悉,这里不做过多介绍,如果不是很了解, 可以先阅读Spring Aop 核心概念arrow-up-right ,下面我将进行核心的业务开发。

自定义注解

@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解析器

效果演示

image-20210716164502028

加上以SpEl的功能可以让我们的Aop操作更加强大。也可以实现更多的处理,可以是我们的日志更加丰富,项目源代码arrow-up-right

Last updated

Was this helpful?