1. 程式人生 > >SpringBoot入門系列篇(十四):使用@Async註解進行非同步方法呼叫

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的事務管理器中,而在同一個類中的一個方法呼叫另一個方法只會經過一次事務攔截器,所以如果是後面的方法使用了事務註解將不會生效,在這裡非同步呼叫也是同樣的道理

參考文獻
需要注意的問題二:非同步方法的事務呼叫問題

在@Async註解的方法上再使用@Transaction註解是無效的,在@Async註解的方法中呼叫Service層的事務方法是有效的

需要注意的問題三:非同步方法必須是例項的

因為靜態方法不能被override重寫,因為@Async非同步方法的實現原理是通過注入一個代理類到Bean中,該代理類整合這個Bean並且需要重寫這個非同步方法,所以需要是例項方法

參考文獻
程式碼示例