【764、平常使用 SpringAop 的场景,怎么做的,介绍一下】

144 阅读2分钟

Spring AOP(面向切面编程)是 Spring 框架的一个核心特性,它提供了一种非侵入式的方式来将横切关注点(如日志记录、性能统计、事务管理等)与业务逻辑分离开来。下面是一些使用 Spring AOP 的常见场景和示例:

  1. 日志记录:通过 AOP,可以在方法执行前后、异常抛出时等关键节点记录方法的执行日志。可以定义一个切面来捕获这些方法,实现日志记录的逻辑。例如:
@Aspect
@Component
public class LoggingAspect {
  
    @Before("execution(* com.example.service.*.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        // 记录方法调用前的日志
    }

    @AfterReturning("execution(* com.example.service.*.*(..))")
    public void logAfterReturning(JoinPoint joinPoint) {
        // 记录方法成功返回后的日志
    }

    @AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))", throwing = "ex")
    public void logAfterThrowing(JoinPoint joinPoint, Exception ex) {
        // 记录方法抛出异常时的日志
    }
}
  1. 性能统计:通过 AOP,可以统计方法的执行时间、调用次数等信息,用于性能监控和优化。可以定义一个切面来捕获这些方法,并记录相关指标。例如:
@Aspect
@Component
public class PerformanceAspect {
  
    @Around("execution(* com.example.service.*.*(..))")
    public Object measurePerformance(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        long endTime = System.currentTimeMillis();
        long executionTime = endTime - startTime;
        
        // 记录方法执行时间等性能指标
        return result;
    }
}
  1. 事务管理:通过 AOP,可以在方法执行前后开启、提交或回滚事务,实现声明式的事务管理。Spring 的 @Transactional 注解就是基于 AOP 实现的。例如:
@Aspect
@Component
public class TransactionAspect {
  
    @Before("@annotation(org.springframework.transaction.annotation.Transactional)")
    public void beginTransaction() {
        // 开启事务
    }

    @AfterReturning("@annotation(org.springframework.transaction.annotation.Transactional)")
    public void commitTransaction() {
        // 提交事务
    }

    @AfterThrowing(pointcut = "@annotation(org.springframework.transaction.annotation.Transactional)", throwing = "ex")
    public void rollbackTransaction(Exception ex) {
        // 回滚事务
    }
}

在上述示例中,@Aspect 注解表示一个切面,@Component 注解将其声明为一个 Spring 组件。切面中的各个方法使用不同的切点表达式来指定需要拦截的方法,然后在特定的切点上执行相应的逻辑。