Spring AOP(二) Spring AOP 完整指南

张开发
2026/4/11 21:52:48 15 分钟阅读

分享文章

Spring AOP(二) Spring AOP 完整指南
Spring AOP二Spring AOP 完整指南Spring AOP 完整指南一、Around 切入点表达式大全常用切入点表达式表格二、execution 表达式详解最强大语法格式常用示例表格通配符说明三、组合表达式四、Spring AOP 五种通知类型完整对比表格五、各通知类型代码示例1. Around - 环绕通知最强大2. Before - 前置通知3. AfterReturning - 后置返回通知4. AfterThrowing - 异常通知5. After - 最终通知六、执行顺序对比正常执行流程异常执行流程七、实战案例完整的切面八、选择建议九、注意事项Spring AOP 完整指南一、Around切入点表达式大全常用切入点表达式表格表达式说明示例annotation(注解名)匹配标注了某个注解的方法annotation(authCheck)execution(...)匹配方法执行最常用execution(* com.example.service.*.*(..))within(包或类)匹配指定包或类中的所有方法within(com.example.service.*)this(类型)匹配代理对象是指定类型的方法this(com.example.service.UserService)target(类型)匹配目标对象是指定类型的方法target(com.example.service.UserService)args(参数类型)匹配方法参数符合类型的方法args(java.lang.String, ..)within(注解)匹配标注了某个注解的类中的所有方法within(org.springframework.stereotype.Service)target(注解)匹配目标对象标注了某个注解的方法target(org.springframework.stereotype.Controller)args(注解)匹配方法参数标注了某个注解的方法args(com.example.annotation.Sensitive)bean(bean名称)匹配指定名称的 Beanbean(userService)二、execution表达式详解最强大语法格式execution(修饰符? 返回类型 方法名(参数) throws 异常?)常用示例表格表达式说明execution(public * *(..))所有 public 方法execution(* set*(..))所有以 “set” 开头的方法execution(* com.example.service.*.*(..))service 包下所有类的所有方法execution(* com.example.service..*.*(..))service 包及其子包下所有方法execution(* com.example.service.UserService.*(..))UserService 类的所有方法execution(public User com.example.service.UserService.getById(..))精确匹配 getById 方法execution(* *(java.lang.String))只有一个 String 参数的方法execution(* *(.., java.lang.String))最后一个参数是 String 的方法execution(* *(java.util.List, ..))第一个参数是 List 的方法execution(* com.example.service.*.*(..)) !execution(* *.delete*(..))service 包所有方法排除 delete 开头通配符说明通配符含义*匹配任意字符一个..匹配多个包、多个参数匹配子类三、组合表达式运算符说明示例与同时满足execution(* com.example.service.*.*(..)) annotation(authCheck)||或满足其一annotation(authCheck) || annotation(loginCheck)!非不满足!execution(* *.delete*(..))四、Spring AOP 五种通知类型完整对比表格通知类型注解执行时机能否控制方法执行典型应用场景环绕通知Around方法执行前后✅ 能通过proceed()权限校验、事务管理、性能监控前置通知Before方法执行前❌ 不能日志记录、参数校验后置通知AfterReturning方法成功返回后❌ 不能处理返回值、缓存更新异常通知AfterThrowing方法抛出异常后❌ 不能异常处理、告警通知最终通知After方法执行完成后无论成功或失败❌ 不能资源释放、清理工作五、各通知类型代码示例1.Around- 环绕通知最强大Around(annotation(authCheck))publicObjectdoAround(ProceedingJoinPointjoinPoint,AuthCheckauthCheck)throwsThrowable{System.out.println( 前置处理 );// 执行原方法ObjectresultjoinPoint.proceed();System.out.println( 后置处理 );returnresult;}2.Before- 前置通知Before(annotation(authCheck))publicvoiddoBefore(JoinPointjoinPoint,AuthCheckauthCheck){// 获取方法名StringmethodNamejoinPoint.getSignature().getName();System.out.println(即将执行方法: methodName);// 获取参数Object[]argsjoinPoint.getArgs();System.out.println(参数: Arrays.toString(args));}3.AfterReturning- 后置返回通知AfterReturning(valueannotation(authCheck),returningresult)publicvoiddoAfterReturning(JoinPointjoinPoint,Objectresult){System.out.println(方法执行成功返回值: result);// 可以修改返回值但不推荐if(resultinstanceofBaseResponse){((BaseResponse?)result).setMessage(操作成功);}}4.AfterThrowing- 异常通知AfterThrowing(valueannotation(authCheck),throwingexception)publicvoiddoAfterThrowing(JoinPointjoinPoint,Throwableexception){StringmethodNamejoinPoint.getSignature().getName();System.err.println(方法 methodName 执行失败: exception.getMessage());// 记录错误日志、发送告警等log.error(方法 {} 执行异常,methodName,exception);}5.After- 最终通知After(annotation(authCheck))publicvoiddoAfter(JoinPointjoinPoint){// 无论成功还是失败都会执行System.out.println(方法执行完成进行资源清理);}六、执行顺序对比正常执行流程Around 前置处理 ↓ Before 前置通知 ↓ 执行原方法 ↓ AfterReturning 后置返回通知 ↓ After 最终通知 ↓ Around 后置处理异常执行流程Around 前置处理 ↓ Before 前置通知 ↓ 执行原方法抛出异常 ↓ AfterThrowing 异常通知 ↓ After 最终通知 ↓ Around 捕获异常可选七、实战案例完整的切面AspectComponentSlf4jpublicclassLogAspect{Around(annotation(logAnnotation))publicObjectaround(ProceedingJoinPointjoinPoint,LoglogAnnotation)throwsThrowable{longstartTimeSystem.currentTimeMillis();try{// Before 的逻辑log.info(开始执行方法: {},joinPoint.getSignature().getName());// 执行原方法ObjectresultjoinPoint.proceed();// AfterReturning 的逻辑longendTimeSystem.currentTimeMillis();log.info(方法执行成功耗时: {}ms,endTime-startTime);returnresult;}catch(Throwablee){// AfterThrowing 的逻辑log.error(方法执行失败: {},e.getMessage(),e);throwe;}finally{// After 的逻辑log.info(方法执行完成);}}}八、选择建议场景推荐通知需要控制方法是否执行如权限校验Around需要修改返回值Around只需要在方法前做处理如日志Before只需要处理方法返回值AfterReturning只需要处理异常情况AfterThrowing需要释放资源无论成功失败After性能监控计算耗时Around九、注意事项Around最强大可以替代其他所有通知但不要滥用Before无法阻止方法执行只能在前做处理AfterReturning只在成功时执行异常时不执行AfterThrowing只在异常时执行成功时不执行After无论如何都会执行类似finally多个切面的执行顺序可以使用Order注解控制切入点表达式越精确越好避免不必要的拦截总结execution是最强大的切入点表达式几乎可以匹配任何方法Around是最灵活的通知类型可以完全控制方法的执行实际开发中Aroundexecution/annotation组合使用最为常见

更多文章