这个应该是工作中用的最多的。有必要掌握这块知识。
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