Q:怎么理解Spring AOP,它的實(shí)現(xiàn)原理是什么,應(yīng)用場(chǎng)景有哪些?
A:AOP,即面向切面編程,是對(duì)OOP(面向?qū)ο缶幊蹋┑囊淮笱a(bǔ)充,OOP更多的關(guān)注業(yè)務(wù)功能,AOP更多的關(guān)注系統(tǒng)功能,所以,使用的場(chǎng)景包括:日志,事務(wù)和權(quán)限管理等;
它是基于動(dòng)態(tài)代理實(shí)現(xiàn)的,Spring AOP中存在著兩種動(dòng)態(tài)代理模式,JDK動(dòng)態(tài)代理和CGLib動(dòng)態(tài)代理。JDK動(dòng)態(tài)代理只能代理接口,通過(guò)反射技術(shù)獲取被代理類的構(gòu)造方法和代理類,從而創(chuàng)建代理對(duì)象,代理對(duì)象在執(zhí)行代理方法時(shí),會(huì)在invokeHandler(...)中進(jìn)行增強(qiáng)操作;CGLib動(dòng)態(tài)代理是基于ASM技術(shù)實(shí)現(xiàn)的,他可以對(duì)類進(jìn)行代理,即直接加載被代理類的字節(jié)碼,通過(guò)修改字節(jié)碼生成一個(gè)父類為被代理類的子類,子類中重寫(xiě)了父類中的代理方法,這樣,代理對(duì)象執(zhí)行代理方法時(shí)也會(huì)執(zhí)行增強(qiáng)操作,但執(zhí)行增強(qiáng)方法是通過(guò)Fast-Class機(jī)制進(jìn)行的,它是通過(guò)計(jì)算增強(qiáng)方法的hash值,來(lái)直接調(diào)用,相較反射,效率會(huì)高一些。
Spring AOP中代理接口時(shí)默認(rèn)使用JDK動(dòng)態(tài)代理,其他情況使用CGLib動(dòng)態(tài)代理。