Spring Boot使用AOP在指定方法执行完后执行异步处理操作

 更新时间:2024年06月22日 10:53:07   作者:langzitianya  
这篇文章主要介绍了Spring Boot使用AOP在指定方法执行完后执行异步处理操作,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下

1.在pom.xml中加入如下依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2.在Spring Boot的application启动类上加上

      @EnableAsync(proxyTargetClass = true)
       proxyTargetClass为可选配置相,默认为false

3.创建异步执行类MyAsyncTask

@Component
public class MyAsyncTask {
    private Logger logger = LoggerFactory.getLogger(getClass());
    @Async
    public void refreshMyDbAsync(String url, String id) {
    	for(int i=0; i < 10; i++){
    	    logger.info("2.In Async Method id:" + id + " count:" + i + " URL:" + url);
    	    try {
		    Thread.sleep(5000);
	    } catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	    }
    	}
    }
}

4.创建Aspect类,定义切入点并在切入点执行后调用异类执行类的异步方法

@Aspect
@Component
public class MyAspect {
    private Logger logger = LoggerFactory.getLogger(getClass());
    @Autowired
    private MyAsyncTask myAsyncTask;
    @Pointcut("execution(* com.lantian.controller.Controller1.detail(..)) || "
            + "execution(* com.lantian.controller.Controller1.list(..)) || "
            + "execution(* com.lantian.controller.Controller2.detail(..))")
    public void modifyMethod() {}
    @AfterReturning(returning = "ret", pointcut = "modifyMethod()")
    public void afterModify(Object ret) {
    	//获取request
    	HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    	String url = request.getRequestURL().toString();
    	String id = request.getParameter("id");
    	logger.info("1.Before Async Method URL:"+url);
    	logger.info(ret+"");
    	myAsyncTask.refreshMyDbAsync(url, id);
    	logger.info("3.After Async Method URL:"+url);
    }
}

5.注意事项:

   异步方法不能直接写在Aspect类里,否则不会异步执行。
      spring对@Transactional注解时也有类似问题,spring扫描时具有@Transactional注解方法的类时,是生成一个代理类,由代理类去开启关闭事务,而在同一个类中,方法调用是在类体内执行的,spring无法截获这个方法调用。

到此这篇关于Spring Boot使用AOP在指定方法执行完后执行异步处理的文章就介绍到这了,更多相关Spring Boot AOP执行异步处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MyBatis与其使用方法示例详解

    MyBatis与其使用方法示例详解

    MyBatis是一个支持自定义SQL的持久层框架,通过XML文件实现SQL配置和数据映射,简化了JDBC代码的编写,本文给大家介绍MyBatis与其使用方法讲解,感兴趣的朋友一起看看吧
    2025-03-03
  • MyBatis基于pagehelper实现分页原理及代码实例

    MyBatis基于pagehelper实现分页原理及代码实例

    这篇文章主要介绍了MyBatis基于pagehelper实现分页原理及代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Java中异常Exception和捕获以及自定义异常详解

    Java中异常Exception和捕获以及自定义异常详解

    在工作过程中,我们常常需要在合适的地方抛出合适的异常,除了java自带的一些异常,我们可以在项目中定制自己的异常,并且全局捕获它,下面这篇文章主要给大家介绍了关于Java中异常Exception和捕获以及自定义异常的相关资料,需要的朋友可以参考下
    2023-05-05
  • 实例讲解String Date Calendar之间的转换

    实例讲解String Date Calendar之间的转换

    下面小编就为大家带来一篇实例讲解String Date Calendar之间的转换。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 详细聊聊Spring MVC重定向与转发

    详细聊聊Spring MVC重定向与转发

    大家应该都知道请求重定向和请求转发都是web开发中资源跳转的方式,这篇文章主要给大家介绍了关于Spring MVC重定向与转发的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-09-09
  • 实例解析如何正确使用Java数组

    实例解析如何正确使用Java数组

    同一种类型数据的集合。其实数组就是一个容器。运算的时候有很多数据参与运算,那么首先需要做的是什么下面我们就一起来看看。
    2016-07-07
  • Mybatis插件扩展及与Spring整合原理分析

    Mybatis插件扩展及与Spring整合原理分析

    这篇文章主要介绍了Mybatis插件扩展及与Spring整合原理,本文通过实例文字相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Spring的同一个服务会加载多次的问题分析及解决方法

    Spring的同一个服务会加载多次的问题分析及解决方法

    这篇文章主要介绍了Spring的同一个服务为什么会加载多次,我们先来梳理一下 Web 容器中如何加载 Bean,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • IntelliJ IDEA快速创建getter和setter方法

    IntelliJ IDEA快速创建getter和setter方法

    这篇文章主要介绍了IntelliJ IDEA快速创建getter和setter方法,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • IDEA中springboot的热加载thymeleaf静态html页面的方法

    IDEA中springboot的热加载thymeleaf静态html页面的方法

    这篇文章主要介绍了IDEA中springboot的热加载thymeleaf静态html页面的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07

最新评论