問題描述
王德發?!本來想裝逼使用@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纔怪