aop 通知

本文详细介绍了AOP(面向切面编程)中的五种通知类型:前置通知、后置通知、环绕通知、异常通知及它们的执行顺序。前置通知在切入点之前执行;后置通知在切入点执行完成后执行;环绕通知则在调用方法前后完成自定义行为;异常通知在切入点抛出异常后执行。

aop通知分为



  • 前置通知(before advice):在切入点之前执行。
  • 后置通知(after returning advice):在切入点执行完成后,执行通知。
  • 环绕通知(around advice):包围切入点,调用方法前后完成自定义行为。
  • 异常通知(after throwing advice):在切入点抛出异常后,执行通知。

先执行 before,然后是环绕 前, point.precessed,后置,环绕后的顺序

<think>嗯,用户想了解AOP通知的类型和使用方法,我得先理清楚Spring AOP中的各种通知类型。首先,根据引用[1],有五种通知类型:前置、后置、返回后、抛出异常后和环绕通知。需要分别解释每种通知的作用和使用场景。 然后,用户可能想知道如何在实际代码中应用这些通知。比如,前置通知用@Before注解,后置用@After,返回后用@AfterReturning,异常通知用@AfterThrowing,环绕通知用@Around。要给出具体的代码示例,这样用户能更直观地理解。 另外,引用[3]提到应该选择最简单的通知类型来避免潜在错误,比如能用后置通知就不用环绕。这点很重要,需要提醒用户注意。同时,引用[2]中的代码结构展示了不同通知的执行顺序,应该在回答中说明各个通知在流程中的位置,比如环绕通知包裹目标方法,其他通知在特定节点执行。 还有,用户可能对@target和@within的区别有疑问,引用[4]提到它们的继承性不同,虽然问题主要关于通知类型,但如果有相关使用场景,可以简要提及,但可能不需要深入,除非用户特别问到。 需要确保回答结构清晰,分点列出每种通知,给出定义、使用注解和示例代码。最后,生成的相关问题要覆盖通知的选择、执行顺序、常见错误和与其他AOP概念的结合,这样用户可以有进一步学习的路径。</think>### AOP通知类型及使用方法 #### 一、AOP通知分类 Spring AOP定义了5种通知类型,通过注解或XML配置实现: 1. **前置通知(Before Advice)** 在目标方法执行前触发,用于参数校验、权限控制等场景。 示例代码: ```java @Before("execution(* com.example.service.*.*(..))") public void beforeAdvice(JoinPoint joinPoint) { System.out.println("方法执行前:" + joinPoint.getSignature().getName()); } ``` 2. **后置通知(After Advice)** 在目标方法执行后触发(无论是否抛出异常),用于资源清理、日志记录。 ```java @After("execution(* com.example.service.*.*(..))") public void afterAdvice(JoinPoint joinPoint) { System.out.println("方法执行完成"); } ``` 3. **返回后通知(After Returning Advice)** 仅在目标方法**正常返回**后触发,用于处理返回值。 ```java @AfterReturning(pointcut="execution(* com.example.service.*.*(..))", returning="result") public void afterReturningAdvice(Object result) { System.out.println("方法返回值:" + result); } ``` 4. **抛出异常后通知(After Throwing Advice)** 仅在目标方法**抛出异常**时触发,用于异常监控。 ```java @AfterThrowing(pointcut="execution(* com.example.service.*.*(..))", throwing="ex") public void afterThrowingAdvice(Exception ex) { System.out.println("发生异常:" + ex.getMessage()); } ``` 5. **环绕通知(Around Advice)** 包裹目标方法,可控制方法是否执行及修改返回值,功能最强大但需谨慎使用[^3]。 ```java @Around("execution(* com.example.service.*.*(..))") public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable { System.out.println("环绕前操作"); Object result = pjp.proceed(); // 必须调用proceed() System.out.println("环绕后操作"); return result; } ``` #### 二、关键注意事项 1. **执行顺序** 典型执行流程: $$ \text{环绕前} \rightarrow \text{前置} \rightarrow \text{目标方法} \rightarrow \text{环绕后} \rightarrow \text{返回后/异常后} \rightarrow \text{后置} $$ 若发生异常:环绕通知仍会执行后半部分[^2]。 2. **注解选择原则** - 优先使用特定场景通知(如@AfterReturning处理返回值) - 仅在需要完全控制方法执行时使用@Around - 避免忘记调用proceed()导致方法未执行[^3] 3. **切点表达式优化** 推荐使用@Pointcut定义复用切点: ```java @Pointcut("execution(* com.example.service.*.*(..))") private void serviceLayer() {} @Before("serviceLayer()") public void logBefore() { ... } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值