spring aop的@Before,@Around,@After,@AfterReturn,@AfterThrowing执行顺序
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执行顺序相关推荐
- 过滤器、拦截器、AOP、ControllerAdvcie的使用对比、执行顺序及代码教程
文章目录 前言 过滤器Filter 简介 使用方法 代码实现 测试 拦截器Interceptor 简介 使用方法 代码实现 测试 ControllerAdvice 简介 使用方法 代码实现 测试 AO ...
- 关于@Around、@Before、@After、@AfterReturning、@AfterThrowing执行顺序以及执行结果总结
spring4.x版本的执行结果顺序是: @Around注解方法的前半部分业务逻辑 ->@Before注解方法的业务逻辑 ->目标方法的业务逻辑 ->@Around注解方法的后半部分 ...
- Spring Bean初始化的几种方法以及执行顺序
@PostConstruct 构造后置执行 @Bean(initMethod="xxx") 初始化功能 @InitializingBean#afterPropertiesSet 属 ...
- Spring AOP 实现业务和异常日志记录实战
1 业务需求:今日,公司要求对操作的业务和日志统一做处理,需要把业务表数据相关信息存入日志表中,比如表名,方法名,业务id,操作操作时间modifyTIme等等. 除了在业务主动插入日志数据之外,有个 ...
- 【Spring Boot入门】AOP基础及Advice的执行顺序
本文主要分为两个部分,首先介绍AOP的基础,包括为什么要使用AOP以及AOP中的基本概念,然后讲解AOP中各类Advice的执行顺序并给出简单示例. 一.AOP基础 1.为什么要使用AOP AOP(A ...
- Spring AOP官网学习
Spring AOP官网学习 5.1 AOP概念 让我们从定义一些核心的AOP概念和术语开始.这些术语并不是spring特有的.不幸的是,AOP术语不是特别直观. 1.Aspect(方面):跨多个类的 ...
- Spring Aop面向切面编程自动注入
1.面向切面编程 在程序原有纵向执行流程中,针对某一个或某一些方法添加通知,形成横切面的过程叫做面向切面编程 2.常用概念 原有功能:切点,pointcut 前置通知:在切点之前执行的功能,befor ...
- Spring AOP动态代理
导入依赖: <dependency><groupId>org.springframework</groupId><artifactId>spring-a ...
- Spring AOP 学习笔记
Spring 的AOP AOP 专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在Java EE应用中,常常通过AOP 来处理一些具有横切性质的系统级服务,如事务管理.安全检查.缓存 ...
最新文章
- python处理svg 平移 旋转_d3.js封装文本实现自动换行和旋转平移等功能
- Win7安装golang开发环境--备忘录
- Python基础:02数字
- Construct Binary Tree from Preorder and Inorder Traversal
- C++函数声明和定义
- splunk中 如何隐藏input_翻糖制作中,如何避免裂缝,如何隐藏裂缝,如何防粘?...
- 可变大小、颜色边框、样式的UISwitch
- codevs1700 施工方案第二季
- 引导页的圆点滑动效果
- html 列导航包括导航,在HTML5中,主导航应该在元素内部还是外部?
- mysql服务的注册,启动、停止、注销。 [delphi代码实现]
- ADO 错误:0x80004005,连接字符串属性无效
- 精选的 Go 框架,库和软件的精选清单
- c语言flag跳出循环,四种方法跳出多层循环(return goto flag try)
- swift 首行缩进两个字符
- ai怎么渐变颜色_ai渐变工具怎么用?Adobe Illustrator渐变颜色实操教程
- Dropbox使用问题
- python监听多个udp端口_尝试实现非阻塞python-udp多端口获取wierd异常
- Spring IOC 和AOP 简单理解
- 两台计算机都使用远程桌面,远程桌面设置及使用