搞懂aop三(aspect 基础)

这个应该是工作中用的最多的。有必要掌握这块知识。

aspect可以通过表达式函数以不同的方式描述连接点,方式包括:

  1、方法切点函数:通过描述目标类的方法信息来定位连接点;

  execution():括号里写,描述要代理方法的信息,支持通配符。

  @annotation():括号里写变量名,变量名就是增强方法参数的名,该参数的类型就是那些要目标类方法上加了的注解类型,多个使用,隔离args(name,age),指定前几个后面可以有任意的参数使用..,之前要加,args(name,age,..)

。例:这样可以为满足dubSubmitPointCut切点定义的连接点且这些连接点方法上有DubSubmit注解的方法做代理

这个切点也可以是别的类的一个方法,通过方法的全限名,即包名.类名.方法名  

    @Around("dubSubmitPointCut() && @annotation(dubSubmit)")
    public Object Around(ProceedingJoinPoint joinPoint,DubSubmit dubSubmit) 

 

  2、方法入参切点函数:通过描述目标类方法的参数信息来定位连接点

  arg():使用方法和@annotation类似。例:拦截入参是String的目标类方法

@Before("poincut() && args(name)")
public void before(String name)

  @arg():使用方法和@annotation类似,这里描述要匹配方法参数上加了指定注解的方法。

  3、目标类切点函数:通过描述目标类类型的信息来定位连接点

  within(),target(),@within(),@target()

  4、代理类切点函数:通过描述目标类的代理类信息来定位连接点

  this()

切点表达式函数的通配符、逻辑运算符

  1、通配符:*,..(只有在方法中可以独立使用),+表示本身及子类,这个是最灵活也是最不好掌握的一个点。

    例1: * com.ljh.*.*()匹配com.ljh.service下类所有无参方法,但是不匹配com.ljh.service.impl下类的方法

    例2: * com.ljh.*..*(..) 匹配所有com.ljh包下所有的方法,不论这些方法是何返回类型,是何参数.

    注:execution(),within()支持所有的通配符。

  2、表达式函数逻辑运算符 && || ! 。

增强类型:

  1、@Before 前置增强,目标方法执行之前

  2、@Around 环绕增强,这个可以执行目标方法,也就是说,他可以做前置增强,后置增强,final增强,异常增强,是非常强大的。

  3、@AfterReturning 后置增强,目标方法执行成功,发生异常不会触发

  4、@After fianlly增强,相当于try{目标方法}finally{after逻辑}

  5、@AfterThrowing 异常增强try{目标方法}catch{异常增强逻辑},这个增强下可以指定异常名throwing

posted @ 2020-08-21 13:40  maoyan  阅读(387)  评论(0编辑  收藏  举报