博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring AOP概述
阅读量:4177 次
发布时间:2019-05-26

本文共 1916 字,大约阅读时间需要 6 分钟。

AOP (Aspect-Oriented Programming)是一种特殊的编程结构,是对目前流行的OOP (Object-Oriented Programming)的一种补充。

相对于大家熟悉的OOP (Object-Oriented Programming),OOP的模块单元是class,而AOP的模块单元是aspect。

Spring框架中使用AOP主要是取代EJB中的各种声明式服务,如异常处理、事务管理、日志、安全性等。
Spring框架提供了两种实现AOP的方式:
  • 基于Schema的定义,详情请参考
  • 通过标注集成AspectJ
AOP的相关概念
1. aspect是一种可以横插入其他多个类的类。
Spring中的aspect不能再被自动代理,因而aspect的advice不能再是aspect,即不支持切面的切面。
aspect类中还可以包含advice, pointcut和introduction(inter-type)的定义。
2. join point是程序执行过程中的某个点,如开始执行某个方法的点,通常作为pointcut的组成部分。
3. advice是aspect中定义的方法,通常作为pointcut的组成部分,在pointcut指定的join point处被调用执行。
通常以拦截器链的方式实现
  • around advice,最常用,包含join point的advice,即在join point的前后都有执行,可以阻止join point的执行
方法的第一个参数必须是ProceedingJoinPoint类型的。
方法中调用ProceedingJoinPoint的proceed()方法表示继续执行后续方法。proceed()方法可以带Object[]参数,以改变后续方法的执行。proceed()方法的调用返回Object类型的值。
  • before advice,在join point之前执行advice,但是不能阻止join point的执行
  • after returning advice,join point正常退出之后执行advice
  • after throwing advice,join point异常退出之后执行advice
  • after (finally) advice,join point之后(无论是正常退出还是异常退出)执行advice
advice根据所在的aspect优先级不同而拥有不同的优先级。

对于一个join point处有多个advice要执行时,情况如下:

  • 对于join point之前执行的advice,优先级高的先执行
  • 对于join point之后执行的advice,优先级高的后执行
  • 对于不同aspect中定义的advice,必须通过@Order设置aspect不同的优先级,否则执行顺序不可预期
  • 对于相同aspect中定义的advice,要么将advice分到不同的aspect,要么将advice合并为一个advice,否则执行顺序不可预期

4. pointcut是“方法名+描述join point的表达式”,定义遇到什么样的join point就会执行哪个advice。

在匹配pointcut描述的任何join point处执行advice。
Spring AOP当前(4.0)只支持定义方法的时候指定pointcut,这样的方法返回值只能是void,而且必须是public的(受代理拦截机制的限制)。
execution/this/target/args/within/@target/@args/@within/@annotation
&&, ||, !组合多个pointcut描述
5. introduction(即AspectJ中的inter-type declaration)是通过@DeclareParents声明类实现指定接口。
在aspect中声明的各个advice方法,可以引用任何实现了指定接口的实现类。
@DeclareParents(value="com.xzy.myapp.service.*+", defaultImpl=DefaultUsageTracked.class)

6. target object(advised object)是插入aspect时执行的advice所作用的对象。

每个target object都要创建代理。

7. AOP proxy,AOP框架创建的对象,用以实现aspect。

8. weaving是连接aspect与其他应用类型或对象以创建target object的过程。

转载地址:http://cjlai.baihongyu.com/

你可能感兴趣的文章
NOR Flash擦写和原理分析
查看>>
51单片机程序执行流程(STARTUP.A51)
查看>>
原码, 反码, 补码 详解
查看>>
Java自学第一阶段(二)- 小试牛刀
查看>>
Java自学第一阶段(三)- 万能的变量
查看>>
Java自学第一阶段(四)-万能的变量(2)
查看>>
HashMap存储原理以及与hashcode、equals方法的关系
查看>>
python3.6在windows下安装scrapy遇到的问题总结
查看>>
pycharm中打开scrapy项目,import scrapy报错问题
查看>>
scrapy爬取图片,自定义图片下载路径和图片名称
查看>>
python3下import MySQLdb出错问题
查看>>
Maven搭建SSM框架(eclipse)
查看>>
synchronized+Integer模拟火车票预售,出现的问题总结
查看>>
沉浸式过山车:穿梭时空,自在畅游巨蚁数字虚实世界
查看>>
沉浸式过山车,感受巨蚁数字心灵的激情
查看>>
沉浸式过山车,巨蚁数字带给您前所未有的科技体验
查看>>
质量好的自行车品牌有哪些辐轮王土拨鼠全球顶级自行车品牌排行榜
查看>>
htmlunit爬取js异步加载后的页面
查看>>
修改Linux系统locale设置
查看>>
linux网络无法连接问题
查看>>