AOP的5种advice

advice 5种:
before
after returning(成功)
在目标方法成功之后织入advice
可额外指定一个returning属性,该属性有2个作用:
-advice方法可以通过该属性指定的值来访问目标方法的返回值
-advice方法的声明该返回值类型时,限制目标方法的返回值必须为指定的类型,否则不会织入
如果不想对目标方法的返回值进行限制,可将该返回值声明为Object
after throwing(异常)
在目标方法出现异常时织入的advice,类似catch
可额外指定一个throwing属性,该属性有2个作用:
-advice方法可以通过该属性指定的值来访问目标方法抛出的异常
-advice方法的声明该返回值类型时,限制目标方法的返回值必须为指定的类型,否则不会织入
如果不想对目标方法的异常进行限制,可将该异常声明声明为Exception 和Throwable
**after(不管)**类似finally,通常用来释放一些资源
around

这种advice功能强大,它即可以访问、修改目标方法调用参数,也可以访问、修改目标方法的返回值,它甚至完全阻止目标方法的执行
它即可以在目标方法之前织入,也可以在目标方法之后织入
弱点:它是线程不安全的,能用其他advice搞定,就不要用它
Around advice方法必须满足一下3点:
1.必须声明返回值类型
2.必须声明一个类型为ProceedingJoinpoint类型的形参
3.必须调用ProceedingJoinPoint形参的proceed()方法,这就是调回目标方法,如果没有这一行,目标方法不会执行。

ProceedingJoinPoint继承JoinPoint,JoinPoint包含如下方法:
getArgs:获取目标方法调用的参数
getKind:获取连接点的类型
getSignature:获取目标方法的签名
getTarget:获取对象
getThis:获取AOP代理

不管配置哪种advice都需要指定2个属性:
-method:用注解不要这个属性
-pointcut/pointcut-ref:pointcut直接指定切入点表达式,pointcut-ref引入已有的切入点表达式
5种advice的功能总结:
Before AfterReturning AfterThrowing After Around
访问调用参数 可 可 可 可 可
修改调用参数 不 不 不 不 可
阻止目标方法执行 可 不 不 不 可
访问返回值 不 可 不 不 可
修改返回值 不 可 不 不 可
一般来说,需要修改目标方法的调用参数、修改目标方法的返回值,此时只能使用Around Avice

访问目标方法的调用参数
A。通过为Adivce方法增加一个JointPoint类型的形参
JointPoint.getArgs()即可获取所有形参
B。and args(a,…)至少有一个
如果你在args()指定什么参数,此处就可通过它们来访问目标方法调用的参数,它还会对目标方法的形参进行限制

AOP的切入点指示符
execution(…)
默认下情况下*作为通配符
target(类型):要求目标对象必须是指定类型
this(类型):要求AOP代理对象必须是指定类型
args(a,b):要求目标方法必须有匹配的形参
bean(beanid):专门为用spring的菜鸟准备的
pointcut=“bean (hello) orbean (world)”

你可能感兴趣的:(JAVA,spring)