AOP
-
面向切面编程
-
做无侵入式功能增强的
核心概念
-
连接点(JoinPoint):就是所有方法
-
切入点(Pointcut) :是给需要增强的方法(一个表达式)
-
通知(Advice) :增强功能的方法
-
通知类 :增强方法所属的类
-
切面(Aspect) :描述的是增强的方法和要增强的方法之间的关系(通知和切入点之间的关系)
-
目标对象:Aop在运行程序的时候时代理对象在运行,这个代理对象是对原始对象做的代理,这个原始对象就叫做目标对象。
-
代理:整个AOP的实现过程就是用代理模式进行的。
AOP的工作流程
-
Spring容器启动
-
读取所有切面配置的切入点
-
初始化bean,判定bean对应的类中的方法是否匹配到任意切入点(判定有没有切入点和通知有没有匹配成功)
-
匹配失败,创建对象
-
匹配成功,创建原始对象(目标对象)的代理对象
-
-
获取bean执行方法
-
获取bean,调用方法并执行,完成操作
-
获取bean是代理对象时,根据代理对象的运行模式运行原始方法与增强的内容,完成操作
-
切入点表达式
-
*:单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配出现
任意返回值,任意包中的UserService的类或者接口,带有save的所有方法,一个参数的方法
execution ( public * com.yang.*.UserService.save*(*)) -
.. :多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写
任意包,任意参数
execution ( public User com..UserService.saveById(..)) -
+ :专用于匹配子类类型
execution(**..*Service+.*(..))
书写技巧
-
描述切入点通常描述接口,而不描述实现类,(解耦)
-
访问修饰符可以省略(接口都是public的)
-
查询类使用*通配符匹配,增删改使用精准类型加速匹配
-
包名书写尽量不使用..匹配,效率太低,常用*做单个包描述匹配,或精准匹配
-
UserService 书写成*Service,绑定业务层接口名
-
getById 书写成getBy*
-
参数较为复杂的时候,根据业务灵活调整
-
通常不使用异常作为匹配规则
上代码
aop
package com.yang.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
//@Component
//@Aspect//这个注解是来说明这是个切面
public class MethodAop {
Method1
package com.yang.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
SpringConfig
package com.yang.config;
import org.springframework.context.annotation.*;
Aop数据处理
DataHandleAd.java
package com.yang.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
</dependencies>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码