Spring如利用aop操作日志功
更新时间:2023-11-12前言:
Spring是目前使用较为广泛的Java开源框架之一,其优点包括完善的依赖注入、面向切面编程(AOP)、模块化开发等特点。本文将介绍如何在Spring框架下,利用AOP来操作日志功能。
第一段:
在Spring框架下,通过使用AOP可以轻松实现对系统日志的记录。Spring的AOP模块使用了AspectJ注解来实现切面编程,在AspectJ中,切面就是一个特殊的Java类,它包含了一些Advice和Pointcut。Advice定义了在何时、何地、以何种方式对目标对象进行修改的代码;而Pointcut则决定了Advice将会在哪些切点执行。
@Aspect public class LogAspect { //定义切点 @Pointcut("execution(* com.example.demo..*.*(..))") public void webLog() {} //前置通知 @Before("webLog()") public void doBefore(JoinPoint joinPoint) { //获取请求ip、url等信息并记录日志 Logger logger = LoggerFactory.getLogger(joinPoint.getTarget().getClass()); logger.info("Request URL:", ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getRequestURL()); logger.info("Request Method:", ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getMethod()); } //后置通知 @AfterReturning(returning = "ret", pointcut = "webLog()") public void doAfterReturning(Object ret) { //处理完请求后返回内容并记录日志 Logger logger = LoggerFactory.getLogger(getClass()); logger.info("Response:", ret); } }
第二段:
上述代码中,我们定义了一个LogAspect类,使用了@Aspect注解来表明它是一个切面类。在LogAspect切面类中,我们使用了@Pointcut来定义切点。这里的Pointcut表达式表示拦截com.example.demo包及其子包下所有类的所有方法。@Before注解定义了前置Advice,它在目标方法执行之前执行,用来记录请求信息。@AfterReturning注解定义了后置Advice,它在目标方法返回之后执行,用来记录响应信息。需要注意的是,为了获取HttpServletRequest对象,我们需要使用ServletRequestAttributes类和RequestContextHolder类。
第三段:
在LogAspect切面类中,我们还可以使用其他类型的Advice,如@After、@Around、@AfterThrowing等。其中,@After用于记录一些常规的清理工作;@Around用于包装目标方法,可以在目标方法执行前后对其进行处理;@AfterThrowing用于捕获目标方法抛出的异常。以下是一个示例:
//定义切点 @Pointcut("execution(* com.example.demo..*.*(..))") public void webLog() {} //环绕通知 @Around("webLog()") public Object arround(ProceedingJoinPoint pjp) throws Throwable { //获取请求ip、url等信息并记录日志 Logger logger = LoggerFactory.getLogger(pjp.getTarget().getClass()); logger.info("Request URL:", ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getRequestURL()); logger.info("Request Method:", ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getMethod()); //执行目标方法,并记录响应信息 Object result = pjp.proceed(); logger.info("Response:", result); return result; }
第四段:
在应用程序中引入LogAspect切面类之后,只需要在需要记录日志的类中添加一个@LogAspect注解即可。
@LogAspect @RestController public class UserController { @GetMapping("/hello") public String sayHello() { return "Hello, world!"; } }
通过上述实现,我们可以方便地利用Spring的AOP模块,实现对系统日志的记录。这不仅可以方便快捷地帮助我们定位问题,也是开发高质量、可靠的应用程序的必要手段之一。