【Spring框架】别再死记硬背!AOP 原来这么简单
一、核心定义AOPAspect-Oriented Programming面向切面编程是一种编程范式核心思想是将与业务核心逻辑无关但多个模块都需要的通用功能如日志、事务、权限校验抽离出来形成独立的「切面」再通过「动态代理」的方式织入到业务代码中。用通俗的话讲业务代码是「主线剧情」比如用户下单、支付日志、事务、权限是「背景音乐」所有剧情都需要但不是核心AOP就是把「背景音乐」抽出来单独做再自动加到每段「主线剧情」里不用在每个业务方法里重复写。二、AOP核心概念先记住AOP的核心术语再用「接口权限校验」的例子对应术语通俗解释例子权限校验切面Aspect抽离出来的通用功能模块包含通知切点「权限校验模块」就是一个切面通知Advice切面的具体执行逻辑何时执行「校验用户token是否有效」的代码切点Pointcut通知要织入的位置哪些方法/类所有/api/admin/*开头的接口方法连接点JoinPoint程序执行过程中能插入切面的所有位置如方法调用、异常抛出每个admin接口的调用时刻都是连接点织入Weaving将切面应用到目标对象的过程编译期/类加载期/运行期Spring AOP在运行期通过动态代理织入权限校验三、Spring AOP的实现原理核心考点Spring AOP基于动态代理实现分两种场景目标对象有接口使用JDK动态代理生成接口的代理类基于反射目标对象无接口使用CGLIB动态代理生成目标类的子类基于字节码增强。极简代码示例用AOP实现「接口日志记录」直观展示核心逻辑// 1. 定义切面AspectAspectComponentpublicclassLogAspect{// 2. 定义切点Pointcut匹配com.example.service下所有方法Pointcut(execution(* com.example.service.*.*(..)))publicvoidservicePointcut(){}// 3. 定义通知Advice方法执行前记录日志Before(servicePointcut())publicvoidbeforeAdvice(JoinPointjoinPoint){// 获取方法名和参数记录日志StringmethodNamejoinPoint.getSignature().getName();Object[]argsjoinPoint.getArgs();System.out.println(方法methodName开始执行参数Arrays.toString(args));}// 方法执行后记录日志无论是否异常After(servicePointcut())publicvoidafterAdvice(JoinPointjoinPoint){StringmethodNamejoinPoint.getSignature().getName();System.out.println(方法methodName执行结束);}}四、AOP的典型应用场景日志记录统一记录接口的入参、出参、执行时间无需在每个方法写日志代码事务管理Spring的Transactional就是基于AOP实现方法执行前开启事务执行后提交/回滚权限校验统一校验接口的用户权限比如admin接口必须校验token性能监控统计方法执行耗时定位慢接口异常处理统一捕获业务方法的异常格式化返回结果。五、Spring AOP vs 原生AOP补充Spring AOP是「轻量级AOP实现」仅支持方法级别的连接点不能织入到字段、构造方法AspectJ是「完整的AOP框架」支持编译期/类加载期织入功能更强但配置更复杂Spring AOP默认整合了AspectJ的注解如Aspect但底层还是动态代理。总结AOP核心抽离通用功能切面动态织入业务代码解决代码冗余提高可维护性Spring实现基于动态代理JDK/CGLIB运行期织入核心是切面、切点、通知核心价值分离「业务逻辑」和「通用功能」符合「单一职责原则」是Spring核心特性之一。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2420025.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!