異步調用的概念
異步調用相對於同步調用而言,通常的方法都是程序按照順序來執行的,程序的每一步都需要等到上一步執行完成之後才能繼續往下執行;而異步調用則無需等待,它可以在不阻塞主線程的情況下執行高耗時方法
如何實現異步調用
在不使用SpringBoot的時候我們通常使用多線程的方式來實現異步調用,對於一個web項目的話就需要使用線程池來創建多線程進行調用,而SpringBoot提供了很方便的@Async註解來實現異步方法
需要引入的jar包:
-
<parent>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-parent</artifactId>
-
<version>1.5.3.RELEASE</version>
-
</parent>
-
<dependencies>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-web</artifactId>
-
</dependency>
-
</dependencies>
需要使用到的註解:
@Async:用於指定註解的方式爲異步調用的方法
@EnableAsync:用於開啓異步調用機制,註解在有@Config註解修飾的類上
需要注意的問題一:異步方法的定義位置問題
最好將異步調用的方法單獨放在一個@Component類中,或者說不要將異步調用方法寫在@Controller中,否則將無法進行調用,因爲SpringBoot使用@Transaction需要經過事務攔截器,只有通過了該事務攔截器的方法才能被加入Spring的事務管理器中,而在同一個類中的一個方法調用另一個方法只會經過一次事務攔截器,所以如果是後面的方法使用了事務註解將不會生效,在這裏異步調用也是同樣的道理
參考文獻
spring事務@Transactional在同一個類中的方法調用不生效
SpringBoot集成篇(二) 異步調用Async
需要注意的問題二:異步方法的事務調用問題
在@Async註解的方法上再使用@Transaction註解是無效的,在@Async註解的方法中調用Service層的事務方法是有效的
需要注意的問題三:異步方法必須是實例的
因爲靜態方法不能被override重寫,因爲@Async異步方法的實現原理是通過注入一個代理類到Bean中,該代理類集成這個Bean並且需要重寫這個異步方法,所以需要是實例方法
代碼示例
可以參考該文章裏面的SpringBoot集成篇(二) 異步調用Async
---------------------
作者:19年,重新開始寫
來源:CSDN
原文:https://blog.csdn.net/qq_27905183/article/details/80294497
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!