SpringAOP详细使用

1.AOP切入点表达式

支持切点标识符

Spring AOP支持使用以下AspectJ切点标识符(PCD),用于切点表达式:

  • execution: 用于匹配方法执行连接点。 这是使用Spring AOP时使用的主要切点标识符。 可以匹配到方法级别 ,细粒度
  • within: 只能匹配类这级,只能指定类, 类下面的某个具体的方法无法指定, 粗粒度
  • this: 匹配实现了某个接口:this(com.xyz.service.AccountService)
  • target: 限制匹配到连接点(使用Spring AOP时方法的执行),其中目标对象(正在代理的应用程序对象)是给定类型的实例。
  • args: 限制与连接点的匹配(使用Spring AOP时方法的执行),其中变量是给定类型的实例。 AOP) where the arguments are instances of the given types.
  • @target: 限制与连接点的匹配(使用Spring AOP时方法的执行),其中执行对象的类具有给定类型的注解。
  • @args: 限制匹配连接点(使用Spring AOP时方法的执行),其中传递的实际参数的运行时类型具有给定类型的注解。
  • @within: 限制与具有给定注解的类型中的连接点匹配(使用Spring AOP时在具有给定注解的类型中声明的方法的执行)。
  • @annotation:限制匹配连接点(在Spring AOP中执行的方法具有给定的注解)。

查看文档

 语法:

 访问修饰符:可不写 可以匹配任何一个访问修饰符

返回值:如果是jdk自带类型可以不用写完整限定名,如果是自定义类型需要写上完整限定名,如果被切入的方法返回值不一样可以使用* 代表所有的方法值都能匹配

基本的表达式,自行百度,有时间再补

合并切点表达式

可以使用 &&, || 和 !等符号进行合并操作。也可以通过名字来指向切点表达式。

通知方法的执行顺序

1、正常执行:@Before--->@After--->@AfterReturning

2、异常执行:@Before--->@After--->@AfterThrowing

 Spring在5.2.7之后就改变的advice 的执行顺序。 在github官网版本更新说明中有说明:如图

1、正常执行:@Before--->@AfterReturning--->@After

2、异常执行:@Before--->@AfterThrowing--->@After

更新说明:Release v5.2.7.RELEASE · spring-projects/spring-framework · GitHub

#25186链接:Implement reliable invocation order for advice within an @Aspect · Issue #25186 · spring-projects/spring-framework · GitHub

获取方法的详细信息

添加JoinPoint参数即可

也可以通过相同的方式来获取异常的信息

spring对通过方法的要求

spring对于通知方法的要求并不是很高,你可以任意改变方法的返回值和方法的访问修饰符,但是唯一不能修改的就是方法的参数,会出现参数绑定的错误,原因在于通知方法是spring利用反射调用的,每次方法调用得确定这个方法的参数的值。

表达式的抽取

如果在实际使用过程中,多个方法的表达式是一致的话,那么可以考虑将切入点表达式抽取出来:

环绕通知的使用

总结:环绕通知的执行顺序是优于普通通知的,具体的执行顺序如下:

环绕前置-->普通前置-->目标方法执行-->环绕正常结束/出现异常-->环绕后置-->普通后置-->普通返回或者异常。

但是需要注意的是,如果出现了异常,那么环绕通知会处理或者捕获异常,普通异常通知是接收不到的,因此最好的方式是在环绕异常通知中向外抛出异常。

异常特殊说明:由于使用反射调用方法捕捉到的异常ex.getMessage=null ; 需要通过ex.getCause() 这一点细节注意一下

基于配置的AOP配置

现在没人用xml配置了,太恶心了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

美丽人生1989

有用的小伙伴可以打赏,多谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值