源于螞蟻課堂的學習,點選這裡檢視(老餘很給力)
問題描述
王德發?!本來想裝逼使用@Async去提升代碼執行效率,結果裝逼失敗,現在都臉疼,根本尼瑪沒生效啊。
程式依舊是自上而下執行了,難受的一比,馬哥!
@Async底層原理
@Async會使得目前controller類采用代理設計模式生成代理對象!!!
你妹啊!!這當然會失效啊,代理模式中目标方法執行時,其方法體中調用本類其他方法,會使用this。
而this指的就是目标對象,而非代理對象,是以,這時候還異步個毛啊!!都特麼不走代理了!!
解決方法
1.在目标方法中使用applicationContext再去擷取目前controller的代理類,然後執行異步方法。low的牙比。
2.寫一個類,把異步方法放入這個類中,将這個類注入IOC,controlelr中依賴注入執行異步。
還有個坑,[email protected]時,如果目前controller實作了接口,那TM直接404啊!!尼瑪!!
這嘛原因?
其實很簡單,@Async會使目前類使用代理模式生成代理類,如果沒有實作接口。那麼,會采用CGLIB生成代理對象。
這時的對象是采用繼承目标對象的方式,是以會把目标類上的@Controller等注解也一起繼承過來,不影響其注冊Mapping。
而如果實作了接口,那特麼就是JDK代理了,JDK生成的是個實作目标類接口的代理對象,也就是目标類的注解和代理對象
沒有半毛錢關系,那還注冊個der啊!!,不404才怪
歡迎大家和帝都的雁積極互動,頭腦交流會比個人埋頭苦學更有效!共勉!
公衆号:帝都的雁