对于Aop 一直理解很是不到位 谈谈自己理解!
Aop :
Aspect: 切面 joinpoint 连接点 pointCut 切点 Advice 增强 targert 目标对象 weaving 织入 introduction等组成
理解几个关键字:
采用springboot 方式来快速实现的理解:
故事:月黑风高杀人夜,一个人作案,但是被一个老王看见了 ,由于天气原因老王只看见是一个男的 高175公分,公安局要将10个175 男性抓起来,进行审问。
pointCut:切点
所谓的切点:男 175 可以理解为是对我们要对哪些方法进行增强的描述,好比我们买烟 对要买哪一类的描述
代码体现在:* com.lwd.web.controller.*.*(..) 这里就是切点的描述 说任意类型的 com.lwd.web.controller 任意方法 任意参数的 最终说明了要增强的是哪一类方法
@PointCut("execution(* com.lwd.web.controller.*.*(..))") public void say(){}
joinpoint 连接点
连接点:是一个比较更抽象的概念。 10 个人中每一个具体的人 也就是代码执行过程中具体的增强方法 具体的public com.lwd.web.controller.eat(){} 这个方法
Advice 增强 审讯的动作
before after afterreturning round 等五种增强
增强就是将对切点描述的方法 新增加执行的代码
@Aspect public class Aspect{ @PointCut("execution(* com.lwd.web.controller.*.*(..))") public void say(){} @before("say") public void sayeat(){ 新的代码 } }
Aspecct 切面 故事加起来
那么什么是切面:个人理解 切面就是如果我们要对一个方法要进行增强 (增强:增加这个方法功能) 又不想改变原有方法 虽然我们可以采用代理的方式,aop本身就是动态代理实现 我们要如何将我们写的代码和原有的方法结合起来,我们写的增强代码放在那里 在什么时间增强这个代码 定义的这个切面类就是对上面啰嗦的抽象出来的类。也是上面 joinpoint + pointcut + advice 所有构成了切面
@Aspect public class AopAspect(){ }
在使用aop 的时候我们通常会通过joinpoint 连接点获取增强方法信息
joinpoint 提供了
getArgs() 获取连接点方法运行时的入参列表
getSignature() 获取连接点方法签名对象 方法信息
getTarget() 获取连接点所在的目标对象 方法所在类的对象
getThis() 获取代理对象本身 代理对象
proceedingJoinpoint
继承了joinpoint 新增了两个接口
proceed() 通过反射执行目标对象的连接点出方法
proceed(Objecct [] args ) 通过翻身执行目标对象连接点处的方法
不过使用新的入参替换原来的入参