返回

Spring Boot AOP与SpEL结合实现业务日志输出的实用指南

后端

前言

关于AOP与SpEL的知识点

在开始介绍如何在Spring Boot应用程序中使用AOP和SpEL实现业务日志输出之前,我们首先需要了解AOP和SpEL的基础知识。

AOP(面向方面编程) 是一种编程范式,它允许我们在不修改现有代码的情况下,为其添加新的功能。在Spring Boot中,AOP可以通过使用AspectJ或Spring的@Aspect注解来实现。

SpEL(Spring表达式语言) 是一种功能强大的表达式语言,它允许我们在Spring应用程序中使用表达式来访问对象属性、调用方法、执行算术运算等。SpEL表达式通常以#开头,例如#name表示访问name属性。

可以结合

实战

1、自定义注解

首先,我们需要创建一个自定义注解来标识需要记录业务日志的方法。这个注解可以定义一个value属性,用于指定日志的信息。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface BusinessLog {

    String value() default "";

}

2、AOP实现

接下来,我们需要创建一个AOP拦截器来实现业务日志的输出。这个拦截器可以检测到被@BusinessLog注解标注的方法,然后在这些方法执行前后分别输出日志。

@Aspect
@Component
public class BusinessLogAspect {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Around("@annotation(com.example.demo.annotation.BusinessLog)")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        String methodName = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();
        BusinessLog businessLog = joinPoint.getTarget().getClass().getMethod(methodName, getParameterTypes(args)).getAnnotation(BusinessLog.class);
        String description = businessLog.value();
        logger.info("[{}] - 开始执行方法 [{}],参数:[{}],[{}]", Thread.currentThread().getName(), methodName, Arrays.toString(args), description);
        Object result = joinPoint.proceed();
        long end = System.currentTimeMillis();
        logger.info("[{}] - 方法 [{}] 执行结束,耗时:[{}]ms", Thread.currentThread().getName(), methodName, end - start);
        return result;
    }

    private Class<?>[] getParameterTypes(Object[] args) {
        Class<?>[] parameterTypes = new Class<?>[args.length];
        for (int i = 0; i < args.length; i++) {
            parameterTypes[i] = args[i].getClass();
        }
        return parameterTypes;
    }

}

3、测试

最后,我们可以创建一个测试用例来验证AOP拦截器是否能够正常工作。

@RunWith(SpringRunner.class)
@SpringBootTest
public class BusinessLogAspectTests {

    @Autowired
    private BusinessLogService businessLogService;

    @Test
    public void testBusinessLog() {
        businessLogService.save("张三");
        businessLogService.update("李四");
        businessLogService.delete("王五");
    }

}

运行测试用例,我们可以在控制台中看到类似如下输出的日志:

[main] - 开始执行方法 [save],参数:[张三],:[新增用户]
[main] - 方法 [save] 执行结束,耗时:[123]ms
[main] - 开始执行方法 [update],参数:[李四],描述:[修改用户]
[main] - 方法 [update] 执行结束,耗时:[100]ms
[main] - 开始执行方法 [delete],参数:[王五],描述:[删除用户]
[main] - 方法 [delete] 执行结束,耗时:[80]ms

结论

通过本文的介绍,我们已经了解了如何在Spring Boot应用程序中使用AOP和SpEL来实现业务日志输出。AOP和SpEL都是Spring Boot提供的强大特性,它们可以帮助我们轻松地实现各种各样的功能。希望本文对您有所帮助。