对于 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 ) 通过翻身执行目标对象连接点处的方法
不过使用新的入参替换原来的入参
来源: http://www.bubuko.com/infodetail-2948322.html