1.AOP的基本概念

切面(Aspect) :通知和切入点共同组成了切面(aspect)。可以从注解方式来理解,代码如下。

@aspect为类上面的注解——切面 
@pointcut(…)——切入点。为此类内一个空方法上面的注解。可以把拦截的地址表达式表示为方法签名,利于使用起来方便。 
@before@after等——通知。为此类下面的方法上面的注解。

三者在一块组成一个切面。

连接点(Joinpoint) :程序能够应用通知的一个point,这些“point”就是连接点,例如方法被调用时、异常被抛出时等等。——可以理解为被aop拦截的类或者方法就是连接点。

通知(Advice) :通知定义了切面是什么以及何时使用。描述了切面要完成的工作和何时需要执行这个工作。——可以理解为被注解有@Before等advice注解的安全校验的方法,拦截了过来的请求要做什么逻辑的校验。

切入点(Pointcut) :通知定义了切面要发生的“故事”和时间,那么切入点就定义了“故事”发生的地点,例如某个类或方法的名称。——可以理解为切面切向哪里?是个类或者某层的包路径。 
目标对象(Target Object) :即被通知的对象。 
AOP代理(AOP Proxy) 在Spring AOP中有两种代理方式,JDK动态代理和CGLIB代理。默认情况下,TargetObject实现了接口时,则采用JDK动态代理;反之,采用CGLIB代理。 
织入(Weaving)把切面应用到目标对象来创建新的代理对象的过程,织入一般发生在如下几个时机: 
  (1)编译时:当一个类文件被编译时进行织入,这需要特殊的编译器才能做到,例如AspectJ的织入编译器; 
  (2)类加载时:使用特殊的ClassLoader在目标类被加载到程序之前增强类的字节代码;

  (3)运行时:切面在运行的某个时刻被织入,SpringAOP就是以这种方式织入切面的,原理是使用了JDK的动态代理。

2 注解说明

2.1 @Aspect

作用是把当前类标识为一个切面供容器读取

2.2 @Before
标识一个前置增强方法,相当于BeforeAdvice的功能,相似功能的还有

2.3 @AfterReturning

后置增强,相当于AfterReturningAdvice,方法正常退出时执行

2.4 @AfterThrowing

异常抛出增强,相当于ThrowsAdvice

2.5 @After

final增强,不管是抛出异常或者正常退出都会执行

2.6 @Around

环绕增强,相当于MethodInterceptor

2.7 @DeclareParents

引介增强,相当于IntroductionInterceptor

3 advice(通知)注解的执行先后顺序

这里说下简单情况——针对一个方法只被一个aspect类拦截时,aspect类内部的 advice 将按照以下的顺序进行执行情况如下:

执行到核心业务方法或者类时,会先执行AOP。在aop的逻辑内,先走@Around注解的方法。然后是@Before注解的方法,然后这两个都通过了,走核心代码,核心代码走完,无论核心有没有返回值,都会走@After方法。然后如果程序无异常,正常返回就走@AfterReturn,有异常就走@AfterThrowing。

4 更多切点函数

除了execution(),Spring中还支持其他多个函数,这里列出名称和简单介绍,以方便根据需要进行更详细的查询

4.1 @annotation()

表示标注了指定注解的目标类方法

例如 @annotation(org.springframework.transaction.annotation.Transactional) 表示标注了@Transactional的方法

4.2 args()

通过目标类方法的参数类型指定切点

例如 args(String) 表示有且仅有一个String型参数的方法

4.3 @args()

通过目标类参数的对象类型是否标注了指定注解指定切点

如 @args(org.springframework.stereotype.Service) 表示有且仅有一个标注了@Service的类参数的方法

4.4 within()

通过类名指定切点

如 with(examples.chap03.Horseman) 表示Horseman的所有方法

4.5 target()

通过类名指定,同时包含所有子类

如 target(examples.chap03.Horseman)  且Elephantman extends Horseman,则两个类的所有方法都匹配

4.6 @within()

匹配标注了指定注解的类及其所有子类

如 @within(org.springframework.stereotype.Service) 给Horseman加上@Service标注,则Horseman和Elephantman 的所有方法都匹配

4.7 @target()

所有标注了指定注解的类

如 @target(org.springframework.stereotype.Service) 表示所有标注了@Service的类的所有方法

4.8 this()

大部分时候和target()相同,区别是this是在运行时生成代理类后,才判断代理类与指定的对象类型是否匹配

参考博文: 
1. 小曹学spring–基于@AspectJ和Schema的AOP  
2. 彻底征服 Spring AOP 之 理论篇  
3. 利用Spring AOP自定义注解解决日志和签名校验  
4. Spring AOP @Before @Around @After 等 advice 的执行顺序

spring aop的@Before,@Around,@After,@AfterReturn,@AfterThrowing执行顺序相关推荐

  1. 过滤器、拦截器、AOP、ControllerAdvcie的使用对比、执行顺序及代码教程

    文章目录 前言 过滤器Filter 简介 使用方法 代码实现 测试 拦截器Interceptor 简介 使用方法 代码实现 测试 ControllerAdvice 简介 使用方法 代码实现 测试 AO ...

  2. 关于@Around、@Before、@After、@AfterReturning、@AfterThrowing执行顺序以及执行结果总结

    spring4.x版本的执行结果顺序是: @Around注解方法的前半部分业务逻辑 ->@Before注解方法的业务逻辑 ->目标方法的业务逻辑 ->@Around注解方法的后半部分 ...

  3. Spring Bean初始化的几种方法以及执行顺序

    @PostConstruct 构造后置执行 @Bean(initMethod="xxx") 初始化功能 @InitializingBean#afterPropertiesSet 属 ...

  4. Spring AOP 实现业务和异常日志记录实战

    1 业务需求:今日,公司要求对操作的业务和日志统一做处理,需要把业务表数据相关信息存入日志表中,比如表名,方法名,业务id,操作操作时间modifyTIme等等. 除了在业务主动插入日志数据之外,有个 ...

  5. 【Spring Boot入门】AOP基础及Advice的执行顺序

    本文主要分为两个部分,首先介绍AOP的基础,包括为什么要使用AOP以及AOP中的基本概念,然后讲解AOP中各类Advice的执行顺序并给出简单示例. 一.AOP基础 1.为什么要使用AOP AOP(A ...

  6. Spring AOP官网学习

    Spring AOP官网学习 5.1 AOP概念 让我们从定义一些核心的AOP概念和术语开始.这些术语并不是spring特有的.不幸的是,AOP术语不是特别直观. 1.Aspect(方面):跨多个类的 ...

  7. Spring Aop面向切面编程自动注入

    1.面向切面编程 在程序原有纵向执行流程中,针对某一个或某一些方法添加通知,形成横切面的过程叫做面向切面编程 2.常用概念 原有功能:切点,pointcut 前置通知:在切点之前执行的功能,befor ...

  8. Spring AOP动态代理

    导入依赖: <dependency><groupId>org.springframework</groupId><artifactId>spring-a ...

  9. Spring AOP 学习笔记

    Spring 的AOP AOP 专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在Java EE应用中,常常通过AOP 来处理一些具有横切性质的系统级服务,如事务管理.安全检查.缓存 ...

最新文章

  1. python处理svg 平移 旋转_d3.js封装文本实现自动换行和旋转平移等功能
  2. Win7安装golang开发环境--备忘录
  3. Python基础:02数字
  4. Construct Binary Tree from Preorder and Inorder Traversal
  5. C++函数声明和定义
  6. splunk中 如何隐藏input_翻糖制作中,如何避免裂缝,如何隐藏裂缝,如何防粘?...
  7. 可变大小、颜色边框、样式的UISwitch
  8. codevs1700 施工方案第二季
  9. 引导页的圆点滑动效果
  10. html 列导航包括导航,在HTML5中,主导航应该在元素内部还是外部?
  11. mysql服务的注册,启动、停止、注销。 [delphi代码实现]
  12. ADO 错误:0x80004005,连接字符串属性无效
  13. 精选的 Go 框架,库和软件的精选清单
  14. c语言flag跳出循环,四种方法跳出多层循环(return goto flag try)
  15. swift 首行缩进两个字符
  16. ai怎么渐变颜色_ai渐变工具怎么用?Adobe Illustrator渐变颜色实操教程
  17. Dropbox使用问题
  18. python监听多个udp端口_尝试实现非阻塞python-udp多端口获取wierd异常
  19. Spring IOC 和AOP 简单理解
  20. 两台计算机都使用远程桌面,远程桌面设置及使用

热门文章

  1. 神界危机3.4通关方略
  2. Cesium矢量建筑加载
  3. 关于计算机多媒体的论文模板,★计算机多媒体论文提纲范文计算机多媒体论文提纲格式模板...
  4. iPhone手机加入wifi报错: 无法加入网络
  5. 海尔在美设厂竟为赚利差
  6. Win Linux Java 项目堆栈信息调试教程
  7. 买卖股票的zui佳时机
  8. java不使用除号实现除法运算_LeetCode29 Medium 不用除号实现除法
  9. 除号java_关于java中除号和数据类型的关系
  10. 华为p50pro进入开发人员模式