关于 spring-aop理解

对于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 ) 通过翻身执行目标对象连接点处的方法

  不过使用新的入参替换原来的入参

猜你喜欢

转载自www.cnblogs.com/lwdmaib/p/10357384.html