springBoot startup:使用 AOP 处理请求(六)

AOP 简单介绍

AOP , Aspect Oriented Programming
AOP 是一种编程范式,面向切面编程。面向对象编程,主要是按照业务封装成类。AOP 将通用逻辑从业务逻辑中分离出来,形成单独的模块。

适用场景

  • 如登陆之后才能进行某些操作
  • 打印日志

常见的 AOP 注解

注解名称 作用
Before 在运行之前
After 在运行之后
Pointcut 注解一个方法
AfterReturn(returning = "obj", pointcut = "log()") 记录程序的返回值

对所有访问进行拦截,记录日志

新建 aspect/HttpAspect

@Aspect
@Component
public class HttpAspect{
      // 对 BookController 中所有的请求都进行拦截记录
      //@Before("execution(public * com.zzjack.zzjackweb3.controller.BookController.*(..))")
      // 拦截其中一个方法
      @Before("execution(public * com.zzjack.zzjack.zzjackweb3.controller.BookController.bookEntityList(..))")
      public void log(){
            System.out.println(1111111);
      }
}

使用 @After对方法执行之后进行拦截

@Aspect
@Component
public class HttpAspect{
    @After("execution(public * com.zzjack.zzjackweb3.controller.BookController.*(..))")
    public void doAfter(){
        System.out.println(22222);
    }
}

@Pointcut 进行改造

目的是减少重复代码

@Aspect
@Component
public class HttpAspect{
    
    @Pointcut("execution(public * com.zzjack.zzjackweb3.controller.BookController.*(..))")
    public void log(){}

    @Before("log()")
    public void doBefore(){
        System.out.println(1111)
    }
}

使用日志

// 注意选择 slf4j 来记录日志

private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);

@Before("log()")
public void doBefore(){
    logger.info("111111");
}

日志中记录一些关键信息

  1. 返回之前,记录 args/method/ip/类方法
@Before("log()")
public void doBefore(JoinPoint joinPoint){
  ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// url
logger.info("url={}",request.getRequestURL());

//method
logger.info("method={}", request.getMethod());

//ip
logger.info("ip={}",request.getRemoteAddr);

//类方法
logger.info("class method = {}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
// 参数
logger.info("args={}", joinPoint.getArgs());
}
  1. 返回之后,记录返回信息
@AfterReturning(returning = "obj", pointcut = "log()")
public void afterReturning(Object obj){
    logger.info("returning = {}", obj.toString());
}

这时候运行,看到日志中只能看到返回了一个对象,想要让他们返回 字符串还需要在 BookEntity 中重写toString()的方法。

alt + insert, 选择 `toString()`,自动生成 `toString()` 的代码。

你可能感兴趣的:(springBoot startup:使用 AOP 处理请求(六))