AOP
- 概念
- 术语
-
* Aspect:切面,下面所有元素的集合,它是所有元素的载体,所有元组组成一个切面
-
* Join point:连接点,所需要被增强的方法,例如 login(),这个方法当被AOP增强时,这个方法就叫做连接点
-
* Advice:通知,增强方法相对于执行方法的执行时机(前?后?环绕?)
-
* Pointcut:切入点,是切入点的集合,比如某个类中存在 login()和logout(),它们都被某个AOP增强方法增强,那么他们两个都是切入点的元素,切入点表示的就是 增强方法应该从哪里进行切入,知道在哪里切入后,就可以进行增强
-
* Target:目标对象,当方法被增强时,肯定需要对象来调用这个方法,这个对象叫做目标对象。但AOP实际在增强时,会产生一个代理对象来替代目标对象来调用方法实现增强(调用原方法和增强方法)
-
* AOP proxy:代理对象
-
* Weaving:织入,连接点在将要调用时,会发生代理对象来代理目标对象来调用的情况,代理对象中存在可执行的方法包括目标对象的方法和增强方法,目标对象方法和增强方法组合在一起的过程叫做织入。
使用切面
-
首先需要借助 AspectJ的语法,因此需要引入 AspectJ的依赖
-
在一个配置类上开启 AspectJ的语法
-
声明切点
-
声明通知
-
上面步骤完成后,当我们在调用 test.service下的所有方法时,就会先调用切点方法
-
切点的声明语法
支持的切点表达式设计
-
execution:可以精确定义连接点为:包、方法
-
within:只能定义连接点:在包
-
args:定义连接点为,如果方法包含指定的参数即是 连接点,不论包在哪儿
-
&& ! 等表达式
-
@ 符号
-
- @annotation:如果某个方法加了注解,例如加了@Xauv,那么连接点定义为方法加了@Xauv的
- @annotation:如果某个方法加了注解,例如加了@Xauv,那么连接点定义为方法加了@Xauv的
-
此时的注解是:@MyAnnotationn,只有加了 @MyAnnotationn的方法才是连接点
-
- @args:类似的,如果参数加了注解,那么@args对应的连接点为加了特定注解的
- @args:类似的,如果参数加了注解,那么@args对应的连接点为加了特定注解的
-
* @within:表示类加了注解的,其方法才是连接点
-
* @target:这里指的时目标对象,当目标对象匹配时,也就是当目标对象类型是test.service.MyServiceImpl时,才会进行增强。也就是说,如果目标对象时 test.service.MyServiceImpl 那么就会对方法进行增强,如果目标对象不是 MyServiceImpl 那么就不能进行增强
-
* @this:指的是代理对象,下面这个例子指的是:当代理对象类型是test.service.MyService时,才会进行增强。如果是其他类,那么无法增强。
- target和this:其实他们是冲突的,如果匹配target就不能匹配this,反之同。因为 this 是 JDK代理,实现了接口。CGLIB是集成了目标对象的代理。
execution连接点的意义
- execution 表达式由下面几个部分组成
-
* 修饰符(public protected ...),
-
* 返回类型,(int void ...)
-
* 声明类型,(方法名类型 )
-
* 名称匹配,方法所在全路径名
-
* 抛出异常,抛出异常类型
- 下面是详细表达式写法,其中带 ?的,可以写也可以不写
- 上面表达的是:
环绕通知
-
后置通知
-
环绕通知
-
* 当around和after同时存在,先执行around中的后置
-
* 当around和before同时存在,先执行around中的前置
- 环绕增强可以在方法执行中改变参数执行
-
* 这里将方法的参数全都 加10
- ProceedingJoinpoint 只能应用在 @Around 通知中