返回
Spring Boot AOP与SpEL结合实现业务日志输出的实用指南
后端
2023-11-22 16:17:35
前言
关于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提供的强大特性,它们可以帮助我们轻松地实现各种各样的功能。希望本文对您有所帮助。