SpringBoot入門系列篇(十四):使用@Async註解進行異步方法調用

異步調用的概念

異步調用相對於同步調用而言,通常的方法都是程序按照順序來執行的,程序的每一步都需要等到上一步執行完成之後才能繼續往下執行;而異步調用則無需等待,它可以在不阻塞主線程的情況下執行高耗時方法

如何實現異步調用

在不使用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 異步方法

代碼示例

可以參考該文章裏面的SpringBoot集成篇(二) 異步調用Async

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章