面试题:Spring 通知有哪些类型?

在 Spring AOP(面向切面编程)中,通知(Advice)是切面(Aspect)的核心组成部分,用于定义在目标方法的特定执行点(如方法调用前后)执行的逻辑。Spring AOP 提供了以下几种类型的通知:


1. 前置通知(Before Advice)

  • 作用: 在目标方法执行之前执行。
  • 使用场景: 适用于需要在方法执行前进行一些预处理操作,如权限校验、日志记录等。
  • 注解: @Before
  • 示例:
@Aspect
@Component
public class MyAspect {

    @Before("execution(* com.example.MyService.*(..))")
    public void beforeAdvice(JoinPoint joinPoint) {
        System.out.println("Before method: " + joinPoint.getSignature().getName());
    }
}

2. 后置通知(After Returning Advice)

  • 作用: 在目标方法成功执行并返回结果后执行。
  • 使用场景: 适用于需要在方法成功执行后进行一些操作,如日志记录、结果处理等。
  • 注解: @AfterReturning
  • 示例:
@Aspect
@Component
public class MyAspect {

    @AfterReturning(pointcut = "execution(* com.example.MyService.*(..))", returning = "result")
    public void afterReturningAdvice(JoinPoint joinPoint, Object result) {
        System.out.println("After returning from method: " + joinPoint.getSignature().getName());
        System.out.println("Result: " + result);
    }
}

3. 异常通知(After Throwing Advice)

  • 作用: 在目标方法抛出异常时执行。
  • 使用场景: 适用于需要在方法抛出异常时进行一些操作,如日志记录、异常处理等。
  • 注解: @AfterThrowing
  • 示例:
@Aspect
@Component
public class MyAspect {

    @AfterThrowing(pointcut = "execution(* com.example.MyService.*(..))", throwing = "ex")
    public void afterThrowingAdvice(JoinPoint joinPoint, Exception ex) {
        System.out.println("After throwing from method: " + joinPoint.getSignature().getName());
        System.out.println("Exception: " + ex.getMessage());
    }
}

4. 最终通知(After Advice)

  • 作用: 在目标方法执行结束后执行,无论方法是否成功或抛出异常。
  • 使用场景: 适用于需要在方法执行结束后进行一些操作,如资源清理等。
  • 注解: @After
  • 示例:
@Aspect
@Component
public class MyAspect {

    @After("execution(* com.example.MyService.*(..))")
    public void afterAdvice(JoinPoint joinPoint) {
        System.out.println("After method: " + joinPoint.getSignature().getName());
    }
}

5. 环绕通知(Around Advice)

  • 作用: 在目标方法执行前后都执行,可以控制目标方法的执行。
  • 使用场景: 适用于需要在方法执行前后进行一些操作,并且可以控制方法是否执行、修改返回值等。
  • 注解: @Around
  • 示例:
@Aspect
@Component
public class MyAspect {

    @Around("execution(* com.example.MyService.*(..))")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("Before method: " + joinPoint.getSignature().getName());
        Object result = joinPoint.proceed(); // 执行目标方法
        System.out.println("After method: " + joinPoint.getSignature().getName());
        return result;
    }
}

总结

Spring AOP 提供了五种类型的通知:

  1. 前置通知(Before Advice): 在目标方法执行之前执行。
  2. 后置通知(After Returning Advice): 在目标方法成功执行并返回结果后执行。
  3. 异常通知(After Throwing Advice): 在目标方法抛出异常时执行。
  4. 最终通知(After Advice): 在目标方法执行结束后执行,无论方法是否成功或抛出异常。
  5. 环绕通知(Around Advice): 在目标方法执行前后都执行,可以控制目标方法的执行。

这些通知类型可以灵活地组合使用,以满足不同的业务需求。通过 AOP,可以将横切关注点(如日志、事务、权限等)从业务逻辑中分离出来,提高代码的模块化和可维护性。

THE END
点赞8 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容