Spring Boot使用AOP在指定方法執(zhí)行完后執(zhí)行異步處理操作
1.在pom.xml中加入如下依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>2.在Spring Boot的application啟動(dòng)類上加上
@EnableAsync(proxyTargetClass = true)
proxyTargetClass為可選配置相,默認(rèn)為false
3.創(chuàng)建異步執(zhí)行類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.創(chuàng)建Aspect類,定義切入點(diǎn)并在切入點(diǎn)執(zhí)行后調(diào)用異類執(zhí)行類的異步方法
@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.注意事項(xiàng):
異步方法不能直接寫在Aspect類里,否則不會(huì)異步執(zhí)行。
spring對(duì)@Transactional注解時(shí)也有類似問題,spring掃描時(shí)具有@Transactional注解方法的類時(shí),是生成一個(gè)代理類,由代理類去開啟關(guān)閉事務(wù),而在同一個(gè)類中,方法調(diào)用是在類體內(nèi)執(zhí)行的,spring無法截獲這個(gè)方法調(diào)用。
到此這篇關(guān)于Spring Boot使用AOP在指定方法執(zhí)行完后執(zhí)行異步處理的文章就介紹到這了,更多相關(guān)Spring Boot AOP執(zhí)行異步處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring boot自定義http反饋狀態(tài)碼詳解
這篇文章主要給大家介紹了Spring boot自定義http反饋狀態(tài)碼的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。2017-06-06
RocketMQ設(shè)計(jì)之主從復(fù)制和讀寫分離
這篇文章主要介紹了RocketMQ設(shè)計(jì)之主從復(fù)制和讀寫分離,RocketMQ提高消費(fèi)避免Broker發(fā)生單點(diǎn)故障引起B(yǎng)roker上的消息無法及時(shí)消費(fèi),下文關(guān)于了RocketMQ的相關(guān)內(nèi)容,需要的小伙伴可以參考一下2022-03-03
javaweb實(shí)戰(zhàn)之商城項(xiàng)目開發(fā)(二)
這篇文章主要針對(duì)javaweb商城項(xiàng)目開發(fā)進(jìn)行實(shí)戰(zhàn)演習(xí),利用mybatis創(chuàng)建DAO層,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02
Java 實(shí)現(xiàn)鏈表結(jié)點(diǎn)插入
這篇文章主要介紹了Java 實(shí)現(xiàn)鏈表結(jié)點(diǎn)插入操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02
Mybatis與Jpa的區(qū)別和性能對(duì)比總結(jié)
mybatis和jpa兩個(gè)持久層框架,從底層到用法都不同,但是實(shí)現(xiàn)的功能是一樣的,所以說一直以來頗有爭(zhēng)議,所以下面這篇文章主要給大家介紹了關(guān)于Mybatis與Jpa的區(qū)別和性能對(duì)比的相關(guān)資料,需要的朋友可以參考下2021-06-06
SpringBoot?Web請(qǐng)求響應(yīng)詳細(xì)代碼示例
在Web開發(fā)中請(qǐng)求和響應(yīng)是必不可少的環(huán)節(jié),Spring Boot Web應(yīng)用中請(qǐng)求響應(yīng)的分層解耦是構(gòu)建高效、可維護(hù)系統(tǒng)的關(guān)鍵實(shí)踐,下面這篇文章主要介紹了SpringBoot?Web請(qǐng)求響應(yīng)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09
Java通過JNI調(diào)用C++動(dòng)態(tài)庫的完整流程詳解
JNI(Java Native Interface),是實(shí)現(xiàn)Java/Kotlin與C/C++語言之間交互的橋梁,本文主要為大家介紹了Java通過JNI調(diào)用C++動(dòng)態(tài)庫的完整流程,需要的可以參考下2025-04-04

