spring-boot版本影响Spring AOP @Before @Around @After等执行顺序

这篇具有很好参考价值的文章主要介绍了spring-boot版本影响Spring AOP @Before @Around @After等执行顺序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

郁闷了半天,我通过AOP切面打印的日志顺序怪怪的,网上查了好几篇文章都说没问题,最后发现是springboot版本升级后@Before @Around @After等执行顺序发生了变化。

1.切面类

@Aspect// 这是一个切面
@Component// 这是一个需要被装配的spring bean
@Slf4j
public class AopOrderAspecct {

    @Pointcut("execution(public void com.example.temp.aopOrder.*.*())")
    public void point() {
    }

    @Before("point()")
    public void before(JoinPoint joinPoint) {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        String methodName = methodSignature.getName();
        log.info("{}-执行before。。。", methodName);
    }

    @Around("point()")
    public void around(ProceedingJoinPoint joinPoint) {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        String methodName = methodSignature.getName();
        log.info("{}-进入around。。。", methodName);
        try {
            joinPoint.proceed();
        } catch (Throwable throwable) {
            log.error("{}-around内部方法执行失败:{}", methodName, throwable.getMessage());
        }
        log.info("{}-around执行完毕!", methodName);
    }

    @After("point()")
    public void after(JoinPoint joinPoint) {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        String methodName = methodSignature.getName();
        log.info("{}-执行after。。。", methodName);
    }

    @AfterReturning("point()")
    public void afterReturning(JoinPoint joinPoint) {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        String methodName = methodSignature.getName();
        log.info("{}-执行afterReturning。。。", methodName);
    }

    @AfterThrowing("point()")
    public void afterThrowing(JoinPoint joinPoint) {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        String methodName = methodSignature.getName();
        log.info("{}-执行afterThrowing。。。", methodName);
    }
}

2.测试Service

@Component
@Slf4j
public class AopOrderServiceA {

    @Resource
    AopOrderServiceB serviceB;

    public void aopOrderA() {
        log.info("aopOrderA-进入方法。。。");
        int x = 0/0;
        serviceB.aopOrderB();
        log.info("aopOrderA-方法执行完毕!");
    }

}

@Component
@Slf4j
public class AopOrderServiceB {

    public void aopOrderB() {
        log.info("aopOrderB-进入方法。。。");
//        int x = 0/0;
        log.info("aopOrderB-方法执行完毕!");
    }
}

3.单元测试

@SpringBootTest
@RunWith(SpringRunner.class)
public class OrderServiceTest {
    @Resource
    AopOrderService aopOrderService;

    @Test
    public void testOrder() {
    	String springVersion = SpringVersion.getVersion();
        String bootVersion = SpringBootVersion.getVersion();
        log.info("spring:{},springBoot:{}", springVersion, bootVersion);
        aopOrderService.aopOrder();
    }
}

4.springboot不同版本的结果

springboot版本 2.3.1.RELEASE 之前,after在around之后执行, 2.3.1.RELEASE 及之后,around包裹整个切面执行周期。

spring boot 版本为 2.0.0.RELEASE

spring:5.0.4.RELEASE,springBoot:2.0.0.RELEASE
aopOrderA-进入around。。。
aopOrderA-执行before。。。
aopOrderA-进入方法。。。
aopOrderA-方法执行完毕!
aopOrderA-around执行完毕!
aopOrderA-执行after。。。
aopOrderA-执行afterReturning。。。

spring boot 版本为 2.1.0.RELEASE

spring:5.1.2.RELEASE,springBoot:2.1.0.RELEASE
aopOrderA-进入around。。。
aopOrderA-执行before。。。
aopOrderA-进入方法。。。
aopOrderA-方法执行完毕!
aopOrderA-around执行完毕!
aopOrderA-执行after。。。
aopOrderA-执行afterReturning。。。

spring boot 版本为 2.2.0.RELEASE

spring:5.2.0.RELEASE,springBoot:2.2.0.RELEASE
aopOrderA-进入around。。。
aopOrderA-执行before。。。
aopOrderA-进入方法。。。
aopOrderA-方法执行完毕!
aopOrderA-around执行完毕!
aopOrderA-执行after。。。
aopOrderA-执行afterReturning。。。

spring boot 版本为 2.3.0.RELEASE

spring:5.2.6.RELEASE,springBoot:2.3.0.RELEASE
aopOrderA-进入around。。。
aopOrderA-执行before。。。
aopOrderA-进入方法。。。
aopOrderA-方法执行完毕!
aopOrderA-around执行完毕!
aopOrderA-执行after。。。
aopOrderA-执行afterReturning。。。

spring boot 版本为 2.3.1.RELEASE(从这里开始不一样)

spring:5.2.7.RELEASE,springBoot:2.3.1.RELEASE
aopOrderA-进入around。。。
aopOrderA-执行before。。。
aopOrderA-进入方法。。。
aopOrderA-方法执行完毕!
aopOrderA-执行afterReturning。。。
aopOrderA-执行after。。。
aopOrderA-around执行完毕!// 注意,这里不同

spring boot 版本为2.7.0(目标方法执行抛出异常时)

spring:5.3.20,springBoot:2.7.0
aopOrderA-进入around。。。
aopOrderA-执行before。。。
aopOrderA-进入方法。。。
aopOrderA-执行afterThrowing。。。// 注意,这里不同
aopOrderA-执行after。。。
aopOrderA-around内部方法执行失败:/ by zero
aopOrderA-around执行完毕!

当目标方法切面嵌套时

spring:5.3.20,springBoot:2.7.0
aopOrderA-进入around。。。
aopOrderA-执行before。。。
aopOrderA-进入方法。。。
aopOrderB-进入around。。。
aopOrderB-执行before。。。
aopOrderB-进入方法。。。
aopOrderB-方法执行完毕!
aopOrderB-执行afterReturning。。。
aopOrderB-执行after。。。
aopOrderB-around执行完毕!
aopOrderA-方法执行完毕!
aopOrderA-执行afterReturning。。。
aopOrderA-执行after。。。
aopOrderA-around执行完毕!
aopOrderA-方法执行完毕!
aopOrderA-执行afterReturning。。。
aopOrderA-执行after。。。
aopOrderA-around执行完毕!


流程图

spring-boot版本影响Spring AOP @Before @Around @After等执行顺序


参考连接:
https://blog.csdn.net/weixin_44005802/article/details/127014570
https://blog.csdn.net/lgxzzz/article/details/100026524文章来源地址https://www.toymoban.com/news/detail-471299.html

到了这里,关于spring-boot版本影响Spring AOP @Before @Around @After等执行顺序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • spring-boot webservice的例子

    源码下载地址 spring-boot-webservice例子资源-CSDN文库 源码下载地址 spring-boot-clintwebservice调用服务的例子资源-CSDN文库

    2024年02月14日
    浏览(38)
  • spring-boot集成spring-brick实现动态插件

    spring-boot集成spring-brick实现动态插件 项目结构 需求实现 spring-boot集成spring-brick 环境说明 1. 主程序集成spring-brick 第一步:引入相关依赖 第二步:修改程序入口方法 第三步:编写配置 第四步:设置maven插件 2. 准备plugin-api 第一步:引入相关依赖 第二步:引入相关依赖 3. 实现

    2024年02月14日
    浏览(33)
  • spring-boot中实现分片上传文件

    一、上传文件基本实现 1、前端效果图展示,这里使用 element-ui plus 来展示样式效果 2、基础代码如下 3、定义后端接口,并且处理好跨域(关于跨域处理,自己百度处理) 4、保存文件到本地文件 二、配置静态目录 1、在 FileApplication.java 旁边添加一个 SpringMvcConfig.java 的文件 2、直

    2024年02月05日
    浏览(41)
  • servlet -> spring-mvc -> spring-boot-> spring-security目录

    springMVC 启动源码 spring-boot注册servlet 3.多种方式注册servlet spring-boot自动注入DispatchServlet spring-security核心配置解读(粗) spring-security源码解读(新)

    2024年02月09日
    浏览(34)
  • 11 spring-boot的MVC配置原理

            1.ContentNegotiatingViewResolver视图解析器;         2.静态资源或者支持WebJars;         3.自动注册类型转换器:比如说前台提交user的字段,后台自动封装的意思;         4.HttpMessageConverters:转换http的请求和相应,比如把一个user字符串转为一个json字符串;        

    2024年02月15日
    浏览(31)
  • spring-boot集成mybatis真的很简单吗?

    在日常的后端开发中,使用mybatis作为DAO层的持久框架已经是惯例。但很多时候都是在别人搭好的框架中进行开发,对怎么搭建环境是一知半解,今天就来实践下。 来看下集成mybatis需要哪些步骤, 1、确定环境及依赖 2、配置文件; 3、测试 这里, 基于springboot集成mybatis。 先

    2024年02月08日
    浏览(35)
  • 基于Java (spring-boot)的图书管理系统

    一、项目介绍 该图书管理系统提供了一系列功能,包括图书管理、图书类型管理、读者借阅归还图书、用户管理和重置密码等。 在图书管理功能中,管理员可以方便地进行图书信息的管理。他们可以添加新的图书记录,包括书名、作者、出版社、ISBN等信息,并可以对已有的

    2024年02月04日
    浏览(35)
  • Spring-boot context.initializer.classes 配置的使用

    在Spring Boot中, context.initializer.classes 是一个属性,允许你在 application.properties 或 application.yml 配置文件中指定一个或多个实现 ApplicationContextInitializer 接口的类。这些类可以在Spring应用上下文初始化之前执行一些自定义的初始化逻辑。 以下是一个使用 context.initializer.classes 属性

    2024年04月11日
    浏览(32)
  • kafka--技术文档--spring-boot集成基础简单使用

            查阅了很多资料了解到,使用了spring-boot中整合的kafka的使用是被封装好的。也就是说这些使用其实和在linux中的使用kafka代码的使用其实没有太大关系。但是逻辑是一样的。这点要注意! 核心配置为: 如果在下面规定了spring-boot的版本那么就不需要再使用版本号,如

    2024年02月11日
    浏览(38)
  • spring-boot-2.2.13.RELEASE 升级 2.6.6 记录

    spring-boot-2.2.13.RELEASE 升级 2.6.6 旧依赖 新依赖 旧配置 新配置 在 bootstrap.properties 中新增如下配置 略

    2024年02月16日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包