-
Spring Boot使用AOP在指定方法执行完后执行异步处理操作
这篇文章主要介绍了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执行异步处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持
原文链接:https://blog.csdn.net/langzitianya/article/details/80003461
最新更新
Java创建对象的六种常用方式总结
Spring Boot使用AOP在指定方法执行完后执行
如何读取MDF(Measurement Data Format)文件中
pythonv如何解析mdf或mf4文件之asammdf用法
SpringBoot实现调用自定义的应用程序((最新
详解如何使用XML配置来定义和管理Spring
SpringBoot中使用MQTT实现消息的订阅和发布
在Spring中实现异步处理的步骤和代码演示
gRPC在Java中的实现与应用详解
redis中存储list<map>,list<entity>的处理
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比