Spring的AOP動(dòng)態(tài)代理有兩種實(shí)現(xiàn)方式,那么這兩種代理方式有什么區(qū)別呢?
區(qū)別
實(shí)現(xiàn)上,如果類是接口的時(shí)候或者類是JDK創(chuàng)建的proxy類時(shí)使用的是JDK的,否則使用CGLib代理。

img
- JDK動(dòng)態(tài)代理必須要有接口,具體用法參考Java使用Porxy和InvocationHandler實(shí)現(xiàn)動(dòng)態(tài)代理
- CGLIB可以對(duì)任何沒(méi)有聲明Final的類進(jìn)行代理。CGLib主要是通過(guò)創(chuàng)建子類的方法,在父類的方法外進(jìn)行操作
性能上:JDK代理需要JVM底層上進(jìn)行方法的分發(fā),而CGLib運(yùn)行創(chuàng)建特定的字節(jié)碼來(lái)改善性能,這是別人做的性能對(duì)比。

image.png
看上去CGLib會(huì)更快一點(diǎn)呢