天天看點

controller中使用了@Async不起作用

源于螞蟻課堂的學習,點選這裡檢視(老餘很給力) 

問題描述

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

@Async底層原理

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

 解決方法

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

2.寫一個類,把異步方法放入這個類中,将這個類注入IOC,controlelr中依賴注入執行異步。
           
controller中使用了@Async不起作用
還有個坑,[email protected]時,如果目前controller實作了接口,那TM直接404啊!!尼瑪!!

這嘛原因?

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

歡迎大家和帝都的雁積極互動,頭腦交流會比個人埋頭苦學更有效!共勉!

公衆号:帝都的雁

controller中使用了@Async不起作用

繼續閱讀