spring aop 语法学习

  • AOP术语

@Before(value = "execution(* com.huangzp.test.aop.*.sayHello(..))")
public void sayHello(){
    System.out.println("我是Aop config");
}
  1. 连接点(Jointpoint):表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化、方法执行、方法调用、字段调用或处理异常等等,Spring只支持方法执行连接点,在AOP中表示为“在哪里干”;

  2. 切入点(Pointcut):选择一组相关连接点的模式,即可以认为连接点的集合,Spring支持perl5正则表达式和AspectJ切入点模式,Spring默认使用AspectJ语法,在AOP中表示为“在哪里干的集合”,上面就是一个切入点,具体到HelloService.sayHello()就是一个连接点。

  3. 通知(Advice):在连接点上执行的行为,通知提供了在AOP中需要在切入点所选择的连接点处进行扩展现有行为的手段;包括前置通知(before advice)、后置通知(after advice)、环绕通知(around advice),在Spring中通过代理模式实现AOP,并通过拦截器模式以环绕连接点的拦截器链织入通知;在AOP中表示为“干什么”;上面System.out.println("我是Aop config");就是通知。

  4. 方面/切面(Aspect):横切关注点的模块化,比如上边提到的日志组件。可以认为是通知、引入和切入点的组合;在Spring中可以使用Schema和@AspectJ方式进行组织实现;在AOP中表示为“在哪干和干什么集合”;可以认为上面整个方法就是一个切面。

  5. 引入(inter-type declaration):也称为内部类型声明,为已有的类添加额外新的字段或方法,Spring允许引入新的接口(必须对应一个实现)到所有被代理对象(目标对象), 在AOP中表示为“干什么(引入什么)”;

  6. 目标对象(Target Object):需要被织入横切关注点的对象,即该对象是切入点选择的对象,需要被通知的对象,从而也可称为“被通知对象”;由于Spring AOP 通过代理模式实现,从而这个对象永远是被代理对象,在AOP中表示为“对谁干”;连接点所在的对象。

  7. AOP代理(AOP Proxy):AOP框架使用代理模式创建的对象,从而实现在连接点处插入通知(即应用切面),就是通过代理来对目标对象应用切面。在Spring中,AOP代理可以用JDK动态代理或CGLIB代理实现,而通过拦截器模型应用切面。

  8. 织入(Weaving):织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程,织入可以在编译期、类装载期、运行期进行。

  • 增强类型
前置增强@Before

将横切逻辑植入切点方法的前面,执行完横切逻辑后接着执行目标逻辑。

后置增强@AfterReturning

将横切逻辑植入目标方法的后面。

环绕增强@Around

将横切逻辑植入目标逻辑前后。

抛出增强@Throwing

类似于捕获异常,并将横切逻辑作为捕获异常的处理。

Final增强@After

类似于Final,将横切逻辑作为Final必须执行的模块。

引介增强@DeclareParent

在不使用显式继承接口的方法为目标类引入新的接口。

  • 切点匹配语法
  1. 匹配注解 @annotation
    @Before("@annotation(com.huangzp.test.grammar.AspectTest)")
    public void before(){
        System.out.println("before...");
    }

所有加了@AspectTest注解的方法执行之前都会先执行这个通知。

  1. 匹配方法 execution
    execution(* com.huangzp.test.aop..*.*(..))
符号 含义
execution 表示匹配方法的切入点关键字
第一个 * 表示切入点返回类型可以为任意类型
com.huangzp.test.aop后面的两个点 .. 在com.huangzp.test.aop这个包及所有子包
第二个* 表示所有类名
第三个 * 表示所有方法名
第二个 .. 表示匹配的方法的参数类型可以为任意类型

@Before("execution(* sayHello(..))") 匹配方法sayHello

  1. 匹配参数 args
    args(String, ..) 匹配第一个参数为string,其他参数任意的方法
符号 含义
.. 表示0个以上任意类型的参数
* 表示1个任意类型的参数
+ 表示某个类型或者其子类型
  1. 匹配类 within
    @Before("within(huangzp.*)") 匹配huangzp包下的所有类
    @Before("within(huangzp..*)") 匹配huangzp包及其子包下的所有类

  2. 复合匹配
    && 并
    || 或

你可能感兴趣的:(spring aop 语法学习)