Before、AfterReturning、AfterThrowing、After、Around

不管配置哪种Advice,都需要指定2个属性:

  1. method:指定将哪个方法转换成Advice。
  2. pointcut或pointcut-ref:pointcut直接指定切入点表达式;pointcut-ref引入已有的切入点表达式。

Before:在目标执行之前织入的Advice。

AfterReturning:在目标方法成功完成之后织入的Advice

可额外指定一个returning属性,该属性值有2个作用:

Advice方法可通过该属性指定的值来访问目标方法的返回值。

Advice方法声明该返回值类型时,限制目标方法的返回值必须是指定的类型。否则该Advice不会织入。如果不想对目标方法的返回值进行限制,可将该返回值声明为Object。

AfterThrowing:在目标方法出现异常时织入的Advice。这种Advice类似于catch块。

可额外指定一个throwing属性,该属性值有2个作用:

Advice方法可通过该属性指定的值来访问目标方法抛出的异常。

Advice方法声明该异常类型时,限制目标方法的抛出的异常必须是指定的类型。否则该Advice不会织入。如果不想对目标方法抛出的异常进行限制,可将该异常声明为Exception或Throwable。

After:不管目标方法成功完成,还是异常结束,该Advice都会织入。这种Advice类似于finally块。(可以用来释放资源)

Around:这种Advice功能最强大,它既可以访问、修改目标方法调用参数,也可访问、修改目标方法的返回值。它甚至完全阻止目标方法的执行。它既可在目标方法之前织入,也可在目标方法之后织入。它是线程不安全,能用其他Advice搞定的,就不要把Around Advice拿出来。

Around Advice方法必须满足以下3点:

  1. 必须声明返回值类型。
  2. 必须声明一个类型为org.aspectj.lang.ProceedingJoinPoint类型的形参。
  3. 必须调用ProceedingJoinPoint形参的proceed()方法,这就是回调目标方法。如果没有这一行,目标方法不会执行。
package com.lwy.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
public class AroundAdviceAspect {public Object around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("模拟开启事务");/*** ProceedingJoinPoint继承了JoinPoint,JoinPoint包含了如下方法:* getArgs:获取目标方法调用参数* getKind:获取连接点类型* getSignature:获取目标方法的方法签名* getTarget:获取目标对象* getThis:获取AOP代理*///访问到目标方法的调用参数Object[] args = pjp.getArgs();// ------------------以上在目标方法之前织入------------------// 回到原来的目标方法,如果去掉此行,目标方法就不会执行Object returnObject = pjp.proceed(args);// ------------------以下在目标方法之前织入------------------System.out.println("模拟关闭事务");return returnObject;}
}

五种Advice的功能总结

Before

AfterReturning

AfterThrowing

After

Around

访问调用参数

Y

Y

Y

Y

Y

修改调用参数

N

N

N

N

Y

阻止目标方法执行

Y(抛异常)

N

N

N

Y

访问返回值

N

Y

N

N

Y

修改返回值

N

N

N

N

Y

AOP的切入点指示符:

Execution([访问权限] [返回值类型] 包.类.方法(形参) [throws 异常])

形参列表:.. 代表任意个任意类型的参数;* 代表1个任意类型的参数

例如:(*,java.lang.String):2个形参,且第二个形参类型为java.lang.String

Spring 增强处理Advice相关推荐

  1. 【转】Spring横切面(advice),增强(advisor),切入点(PointCut)(JAVA后端)

    编辑 删除 Spring横切面(advice),增强(advisor),切入点(PointCut)的一点理解: 1.Spring管理事务有2种,其中一种是HibernateTransactionMan ...

  2. Spring横切面(advice),增强(advisor),切入点(PointCut)

    Spring横切面(advice),增强(advisor),切入点(PointCut)的一点理解: 1.Spring管理事务有2种,其中一种是HibernateTransactionManager管理 ...

  3. Java - 你如何理解AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念?

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net a. 连接点(Joinpoint):程序执行的某个特 ...

  4. Spring中的Advice类型及其应用

    http://blog.csdn.net/myyate/article/details/1822150 在Spring中,Advice都是通过Interceptor来实现的,主要有以下几种: 1. 环 ...

  5. Spring AOP tx:advice

    Xml代码   <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http: ...

  6. Spring 中的Advice类型介绍

    Spring 中的 Advice 类型介绍 翻译原文链接 Introduction to Advice Types in Spring 1. 概述 在本文中,我们将讨论可以在 Spring 中创建的不 ...

  7. spring中tx:advice/tx:advice是什么意思?作用是什么?谁能简单说下

    spring中<tx:advice></tx:advice>是什么意思?作用是什么?谁能简单说下 2013-03-26 17:15暴力娃娃123 | 浏览 13763 次 &l ...

  8. 39. 什么是spring通知(Advice)?

    什么是spring通知(Advice)? 特定 JoinPoint 处的 Aspect 所采取的动作称为 Advice.Spring AOP 使用一个 Advice 作为拦截器,在 JoinPoint ...

  9. spring中tx:advice中的tx是什么的缩写?

    spring中tx:advice中的tx是什么的缩写? transaction的缩写,即是跟事务相关的配置 tx 根据transaction的发音来缩写出来的

最新文章

  1. 软件中的易用性设计及测试(三)之实践
  2. Mongodb常用增删改查语法
  3. Spring Boot2.x-05Spring Boot基础-使用注解完成依赖注入
  4. 一文看透 Redis 分布式锁进化史(解读 + 缺陷分析)
  5. 国内企业应如何实施ITSM
  6. gps数据处理matlab,基于Matlab的数据处理方法在GPS高程拟合中的应用
  7. linux防火墙没看3306访问不,Linux配置防火墙,开启80端口、3306端口
  8. 微服务实践沙龙-上海站
  9. 勤学如春起之苗,不见其增,日有所长!
  10. batchplot 3.6.2 插件_直播插件体系设计
  11. 红帽linux lnmp搭建,RedHat/CentOs系统搭建lnmp环境
  12. 解决访问被拒绝:Microsoft.Web.UI.WebControls的问题
  13. jQuery实现左移右移
  14. QQ尾巴病毒核心技术的实现原理分析
  15. 软件工程师证书怎么考_2020年想考一个证书,考一级造价工程师还是考咨询工程师?...
  16. Web初学-2022.10.22-27
  17. JAVA POI导出Excel文件并添加水印
  18. 平房误差函数_最小平方误差准则函数.ppt
  19. 从杭州崩溃小伙说起:我们被灌输的价值观,真的对吗?
  20. Python与Anaconda、Jupyter Notebook与Pycharm

热门文章

  1. Android device supports but apk only supports armeabi,x86,x86_64
  2. lcx端口转发工具的使用
  3. 彻底弄清补码加减法运算,正数、负数位移运算原理
  4. Mysql主从同步报错解决:Error executing row event: Table zabbix.history-uint doesnt exist
  5. 【51单片机】花式流水灯
  6. Python Pandas DataFrame 删除缺失值 None Nan drop dropna 替换缺失值 fillna 重复值删除 duplicate 数值替换 replace apply
  7. LABVIEW绘制等高线
  8. 常用的参数和非参数检验方法
  9. 手机的键盘是这样的: 1 2 abc 3 def 4 ghi 5 jkl 6 mno 7 pqrs 8 tuv 9 wxyz * 0 #
  10. (01)ORB-SLAM2源码无死角解析-(55) 闭环线程→计算Sim3:总体流程讲解ComputeSim3()