controller中使用了@Async不起作用

源於螞蟻課堂的學習,點擊這裏查看(老餘很給力) 

問題描述

王德發?!本來想裝逼使用@Async去提升代碼執行效率,結果裝逼失敗,現在都臉疼,根本尼瑪沒生效啊。
程序依舊是自上而下執行了,難受的一比,馬哥!

@Async底層原理

@Async會使得當前controller類採用代理設計模式生成代理對象!!!
你妹啊!!這當然會失效啊,代理模式中目標方法執行時,其方法體中調用本類其他方法,會使用this。
而this指的就是目標對象,而非代理對象,所以,這時候還異步個毛啊!!都特麼不走代理了!!

 解決方法

1.在目標方法中使用applicationContext再去獲取當前controller的代理類,然後執行異步方法。low的牙比。

2.寫一個類,把異步方法放入這個類中,將這個類注入IOC,controlelr中依賴注入執行異步。

還有個坑,controller+@Async時,如果當前controller實現了接口,那TM直接404啊!!尼瑪!!

這嘛原因?

其實很簡單,@Async會使當前類使用代理模式生成代理類,如果沒有實現接口。那麼,會採用CGLIB生成代理對象。
這時的對象是採用繼承目標對象的方式,所以會把目標類上的@Controller等註解也一起繼承過來,不影響其註冊Mapping。
而如果實現了接口,那特麼就是JDK代理了,JDK生成的是個實現目標類接口的代理對象,也就是目標類的註解和代理對象
沒有半毛錢關係,那還註冊個der啊!!,不404纔怪

 

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