使用 AOP + 自定义注解 实现 controller的日志打印
首先引入aop pom依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.0.8.RELEASE</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.13</version> <scope>compile</scope> </dependency>
1.创建注解类 Log
package com.zhdj.common.annotation; /** * 被该注解注释的方法会打印日志 * @author 博博 * @time 2020/5/25 */ public @interface Log { }
2.创建 aop切面类,来进行对 自定义注解的切入
package com.zhdj.common.aop; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Enumeration; @Component // lombok 的日志注解 @Slf4j // 该注解 标识这是个aop类 @Aspect public class LogAop { /** * 切入被该注解标志的方法切入 */ @Pointcut("@annotation(com.zhdj.common.annotation.Log)") public void logPointcut() { } /** * 前置切入 */ @Before("logPointcut()") public void doBefore(JoinPoint jp) { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder .getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); System.out.println(); log.info("请求路径:" + request.getRequestURL().toString()); log.info("请求类型:" + request.getMethod()); Enumeration<String> enu = request.getParameterNames(); while (enu.hasMoreElements()) { String name = enu.nextElement(); log.info("属性名:{},属性值:{}", name, request.getParameter(name)); } } /** * 后置切入 */ @AfterReturning(returning = "obj", pointcut = "logPointcut()") public void doAfter(Object obj) { log.info("调用结束.... 返回值:{} ",obj); } }
3.在需要打印日志的controller方法 上加上@Log注解 前置切入 后置切入