內部方法上註解無效的原因

2021-10-03 05:54:04 字數 1130 閱讀 9857

在同乙個類中,乙個方法呼叫另外乙個有註解(比如@async,@transational)的方法,註解是不會生效的。

比如,下面**例子中,有兩方法,乙個有@async註解,乙個沒有。第一次如果呼叫了有註解的test()方法,會啟動@async註解作用;第一次如果呼叫testasync(),因為它內部呼叫了有註解的test(),如果你以為系統也會為它啟動async作用,那就錯了,實際上是沒有的。

@service

public class testasyncservice

@async

public void test() throws interruptedexception

}執行結果:testasync()主線程和從執行緒()test()從執行緒同步執行。

原因:spring 在掃瞄bean的時候會掃瞄方法上是否包含@async註解,如果包含,spring會為這個bean動態地生成乙個子類(即**類,proxy),**類是繼承原來那個bean的。此時,當這個有註解的方法被呼叫的時候,實際上是由**類來呼叫的,**類在呼叫時增加非同步作用。然而,如果這個有註解的方法是被同乙個類中的其他方法呼叫的,那麼該方法的呼叫並沒有通過**類,而是直接通過原來的那個bean,所以就沒有增加非同步作用,我們看到的現象就是@async註解無效。

下面用偽**闡述一下原因

@service

class a

method a()
//spring掃瞄註解後,建立了另外乙個**類,並為有註解的方法加上非同步效果

class proxy$a

method a()
}

當我們呼叫a的bean的a()方法的時候,也是被proxya攔截,執行proxya攔截,執行proxya.a()(標記3),然而,由以上**可知,這時候它呼叫的是objecta.a(),也就是由原來的bean來呼叫a()方法了,所以**跑到了「標記1」。由此可見,「標記2」並沒有被執行到,所以非同步執行的效果也沒有執行。

需要非同步處理的,需要定義在被spring @component @service 等註解的類中,之後通過@@autowired來呼叫@component 修飾類中的被@async修飾的方法

或者直接把@async加到類名上

本文參考了

PHP ini set 無效的原因

php配置中,post max size,upload max filesize用 ini set 方法是修改不了的.正確的做法是用.htaccess檔案 plain php value upload max filesize 1024m php value post max size 1024m ...

PHP setcookie無效的原因分析

ob start 控制您的瀏覽器cache,加在setcookie 之前,一般加在頁面頂部 ob get clean 輸出瀏覽器cache,看看結果是否存在cookie,加在setcookie 之後,一般加在頁面最後 乙個在apache xp下開發的企業 上傳到iis6.0伺服器,出現setcook...

getline 輸入無效的原因

實際上你在每次輸入資料的時候會輸入乙個回車 n cin在讀入整數時候會忽略空白碰到非數字 n 時停止 cin在getline時會把 n 及之前的內容讀回來,哪怕是空行也會讀入 cin在讀入字元時會把緩衝區內當前字元讀入 不會忽略空白 cin.ignore 1000,n 的含義是把緩衝區內從當前字元開...