执行流程 | 你真的了解Spring AOP的执行顺序吗?
Hi! 我是小小,我们又见面了,今天的主要内容是,你真的了解Spring AOP的执行顺序吗?跟随着我的脚步,一块丈量世界,了解世界,重新认识,重新了解Spring AOP的执行顺序。
聊一聊毕业四个月的感受
毕业四个月了,劳动合同还没有签,一切都没有稳定下来,不过也似乎也将要稳定下来了,生活如流水一般非常平稳的运行着,而我的公众号也在非常平稳的编写着,当然啦,自己最喜欢听的音乐也还是没有变,MySoul,一成不变,似乎生活进入了稳定状态,又或者生活没有进入稳定状态,我也不知道,只知道,这就是生活,唯有这样的生活才能继续进行。这四个月对我感觉,就是每天敲啊敲,每天的敲,拿着微薄的薪水,获得着微薄的收入,或许这就是生活,自己的,也许这就是一个普通人,再也不能普通过的了生活了,好啦,不吐槽了,生活还需要继续进行下去,我们隆重的开始今天的正文。
AOP核心概念
需要了解AOP,首先需要了解这些Spring AOP这些核心概念。
Aspect 切面:由一系列切点,增强和引入组成的模块对象,可定义优先级,从而影响增强和引入的执行顺序,事物管理,在Java中就是一个切面应用的例子。
Join point 接入点:程序执行期的一个点,例如方法执行,类初始化,异常处理,在Spring AOP中,接入点始终表示方法的执行。
Advice 增强切面在特点接入点的执行动作,包括 around,before,and after等多种类型,包含Spring在内的许多AOP框架,通常会使用拦截器来实现增强,围绕着接入点维护一个拦截器链。
Pointcut 切点,用来匹配特定接入点的表达式,增强将会与切点表达式产生关联,并运行在任何切点匹配到的接入点上,通过切点表达式匹配接入点是AOP的核心,Spring默认使用Aspect的切点表达式。
Introduction 引入:为某个type声明额外的方法和字段,Spring AOP允许你引入任何接口以及它的默认实现到被挣钱对象上。
Target Object 目标对象,被一个或多个切面增强的对象,也被叫做被增强对象,既然Spring AOP使用运行时代理,那么目标对象就是代理对象。
AOP proxy AOP代理,为了实现切面功能一个对象会被AOP框架创建出来,在Spring框架中,AOP代理的默认方式是,有接口,就使用基于接口的jdk动态代理,否则使用基于类的CGLIB动态代理,但是我们可以通过设置
proxy-target-class="true"
完全使用CGLIB动态代理。Weaving 织入,把一个或多个切面与类或对象链接在一起创建一个被增强对象,织入能发生在编译时,加载时,或运行时,Spring AOP默认就是运行时织入,可以通过枚举adviceMode来设置。
模拟aspect advice的执行过程
在这里我们不再展示测试代码,而是通过简单的代码来模拟aspect advice的执行过程。
话不多说,直接上代码
package doubt;
public class AspectAdviceInvokeProcess {public static void main(String[] args){try {//正常执行AspectInvokeProcess(false);System.out.println("=====分割线=====");//异常执行AspectInvokeProcess(true);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 切面执行过程* @param isException* @throws Exception*/public static void AspectInvokeProcess(boolean isException) throws Exception{try {try {aroundAdvice(isException);} finally {afterAdvice();}afterReturningAdvice();return;} catch (Exception e) {afterThrowingAdvice(e);throw e;return;} }/*** 环绕增强* @param isException* @throws Exception*/private static void aroundAdvice(boolean isException) throws Exception {System.out.println("around before advice");try {JoinPoint_Proceed(isException);} finally {System.out.println("around after advice");}}/*** 编织后的接入点执行过程* @param isException*/public static void JoinPoint_Proceed(boolean isException){beforeAdvice();targetMethod(isException);}/*** 前置增强*/private static void beforeAdvice() {System.out.println("before advice");}/*** 目标方法* @param isException*/private static void targetMethod(boolean isException) {System.out.println("target method 执行");if(isException)throw new RuntimeException("异常发生");}/*** 后置增强*/private static void afterAdvice() {System.out.println("after advice");}/*** 正常返回增强*/private static void afterReturningAdvice() {System.out.println("afterReturning");}/*** 异常返回增强* @param e* @throws Exception*/private static void afterThrowingAdvice(Exception e) throws Exception {System.out.println("afterThrowing:"+e.getMessage());}
}
执行结果
上面代码的执行结果如下,直接体现了同一aspect,不同advice的执行顺序。
around before advice
before advice
target method 执行
around after advice
after advice
afterReturning
===============分割线==============
around before advice
before advice
target method 执行
around after advice
after advice
afterThrowing:异常发生
java.lang.RuntimeException: 异常发生
结果图
不同aspect,advice的执行顺序
Spring AOP 通过制定 aspect 的优先级,控制不同的 aspect,advice的执行顺序。
Aspect 类添加注解:org.springframework.core.annotation.Order,使用注解value属性指定优先级。
Aspect 类实现接口:org.springframework.core.Ordered,实现 Ordered 接口的 getOrder() 方法。
其中,数值越低,表明优先级越高,@Order 默认为最低优先级,即最大数值:
/*** Useful constant for the lowest precedence value.* @see java.lang.Integer#MAX_VALUE*/int LOWEST_PRECEDENCE = Integer.MAX_VALUE;
最终,不同aspect,advice的执行顺序。
入操作,接入点执行前,Brfore 优先级越高,越先执行。
一个切面的入操作执行完,才到下一切面,所有切面入操作执行完,才开始执行接入点。
出操作,优先级越低,越先执行。
一个切面的出操作执行完,才到下一个切面,知道返回调用点。
图示
同一切面,相同接入点
其执行顺序不能直接确定,有如下两种变通方式
将两个 advice 合并为一个 advice,那么执行顺序就可以通过代码控制了
将两个 advice 分别抽离到各自的 aspect 内,然后为 aspect 指定执行顺序
Spring 事物管理器
Spring 事物管理器是基于Spring AOP的
切面优先级
切面优先级,默认为最低的优先级
LOWEST_PRECEDENCE = Integer.MAX_VALUE
关于作者
我是小小,一枚生在二线,活在一线城市的程序猿,一直致力于奋斗在一线编码,我是小小,我们下期再见。
小明菜市场
推荐阅读
● 吊打面试官 | Java到底是值传递还是引用传递
● 容器 | Docker 如此之好,你为什么还要用k8s
● 分布式ID | 这六种分布式ID生成方法,总有一款适合你
● 数据结构与算法 | 来来来,让我们重新认识一下什么是树
● 面试官 | Java转List三种方式,你说说吧。我。。懵逼。啥时候有三种了
给我个好看再走好吗?
执行流程 | 你真的了解Spring AOP的执行顺序吗?相关推荐
- 顺序执行_执行流程 | 你真的了解Spring AOP的执行顺序吗?
Hi! 我是小小,我们又见面了,今天的主要内容是,你真的了解Spring AOP的执行顺序吗?跟随着我的脚步,一块丈量世界,了解世界,重新认识,重新了解Spring AOP的执行顺序. 聊一聊毕业四个 ...
- gtw-050090|执行拦截器时发生异常_执行流程 | 你真的了解Spring AOP的执行顺序吗?...
Hi! 我是小小,我们又见面了,今天的主要内容是,你真的了解Spring AOP的执行顺序吗?跟随着我的脚步,一块丈量世界,了解世界,重新认识,重新了解Spring AOP的执行顺序. 聊一聊毕业四个 ...
- 你真的确定Spring AOP的执行顺序吗
本文内容重点: 问题描述 Spring AOP执行顺序 探究顺序错误的真相 代码验证 结论 问题描述 公司新项目需要搭建一个新的前后分离HTTP服务,我选择了目前比较熟悉的SpringBoot W ...
- spring aop不执行_使用Spring AOP重试方法执行
spring aop不执行 我的一位博客关注者发送了一封电子邮件,要求我显示" Spring AOP的RealWorld用法"示例. 他提到,在大多数示例中,都演示了Spring ...
- Spring学习总结(16)——Spring AOP实现执行数据库操作前根据业务来动态切换数据源
深刻讨论为什么要读写分离? 为了服务器承载更多的用户?提升了网站的响应速度?分摊数据库服务器的压力?就是为了双机热备又不想浪费备份服务器?上面这些回答,我认为都不是错误的,但也都不是完全正确的.「读写 ...
- 请简述Spring MVC的执行流程
需要面试文档可S我 今天我给大家介绍一下Spring MVC的详细执行流程.我把Spring MVC的执行流程划分为三个阶段,配置阶段.初始化阶段和运行阶段. 我整理了一张完整的执行流程图,需要高清图 ...
- Spring IOC执行流程思维导图
IOC执行流程图 执行流程的各个步骤 参考: IOC执行流程及bean生命周期和作用域总结 Spring IoC 核心流程介绍
- Spring AOP Capability and goals
5.1.AOP概念 让我们首先定义一些中心AOP概念和术语.这些术语不是特定于Spring的.不幸的是,AOP术语不是特别直观.但是,如果Spring使用自己的术语,那将更加令人困惑. 方面:跨越多个 ...
- 手撸Spring系列8:Spring AOP(理论篇)
说在前头: 笔者本人为大三在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...
最新文章
- AI之父图灵登上50英镑钞票,荣耀比肩牛顿达尔文;吴恩达:将激励更多人
- freemarker.template.TemplateException: Expected string. column.nullable evaluated instead to freemar
- PowerCLI脚本,利用哈希表对参数进行转换
- 从R-CNN到Mask R-CNN
- 黑客攻击澳大利亚政府网站 抗议互联网过滤器
- oracle 数据库 swap,Oracle swap 100%案例分析
- Android tinyplay与tinycap流程(十六)
- is和==,encode和decode
- tar.bz2解压报错误 Error is not recoverable: exiting now
- 几种图片去水印方法的效果对比
- 红警代码开源了 来瞅瞅源码 文内送Win10可联机的红警2标准版游戏
- __DSB()指令的作用
- JAVA怎么对接第三方短信平台?短信验证码完整API文档
- 2021年危险化学品经营单位安全管理人员考试内容及危险化学品经营单位安全管理人员考试试卷
- java与软件测试哪个好?
- 【Android开发】Android概述
- Elasticsearch 5.x 生产数据的灾备和恢复
- KL变换生成人脸特征图
- 如何进行TDD信号分析?
- 阿里云游戏盾价格(收费标准)
热门文章
- 【资源共享】Rockchip I2C 开发指南 V1.0
- TurnipBit开发板DIY呼吸的吃豆人教程实例
- XenApp_XenDesktop_7.6实战篇之二十一:Linux Virtual Desktop 1.0(下篇)
- kafka之六:为什么Kafka那么快
- 转easyui datagrid 前台分页的实现
- flex中datagrid中的过滤功能
- Java虚拟机-逃逸分析(Escape Analysis)和栈上分配
- python 读写 json文件
- linux 中禁用USB存储
- 优化Oracle网络设置的方案