• 新建一个切面类,定义要切入的方法及如何切入即可,不用写入到逻辑代码中
@Aspect //声明这是一个切面类
@Component //保证被扫描到
public class RequestAspect {
private Logger logger=Logger.getLogger(RequestAspect.class);

@Pointcut("execution(public * com.java1234.controller.*.*(..))") //设置切点,对任意返回值、controller包下任意类、任意方法都切入
public void log(){
}

@Before("log()")
public void doBefore(JoinPoint joinPoint){ //执行前要调用的
    //以info等级打印日志
    logger.info("方法执行前...");
    //获取request
    ServletRequestAttributes sra=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request=sra.getRequest();
    //通过request获取url、IP等
    logger.info("url:"+request.getRequestURI());
    logger.info("ip:"+request.getRemoteHost());
    //获取提交方法(get、post)
    logger.info("method:"+request.getMethod());
    //获取方法名
    logger.info("class_method:"+joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());
    //获取参数列表
    logger.info("args:"+joinPoint.getArgs());
    //得到的参数列表是个数组,打印第一个
    Student student=(Student) joinPoint.getArgs()[0];
    //打印这传入的第一个参数
    System.out.println(student);
}

@After("log()")
public void doAfter(JoinPoint joinPoint){
    logger.info("方法执行后...");
}

@AfterReturning(returning="result",pointcut="log()") //方法返回后要调用的
public void doAfterReturning(Object result){
    logger.info("方法返回值:"+result); //打印执行此方法的返回值(比如“添加成功”这样的提示信息)
}
}
  • controller那边一有方法被执行,这些日志信息就被切入到方法执行过程打印出来
  • 代码实例:D:/SpringBootJpa/aspect/RequestAspect