2020-08-28:Spring AOP和AspectJ AOP有什么區(qū)別?

前言

每日一題專欄

Spring AOP和AspectJ AOP有什么區(qū)別?

AspectJ和Spring AOP都是對(duì)目標(biāo)類增強(qiáng),生成代理類。

AspectJ是在編譯期間將切面代碼編譯到目標(biāo)代碼的,屬于靜態(tài)代理;Spring AOP是在運(yùn)行期間通過代理生成目標(biāo)類,屬于動(dòng)態(tài)代理。
AspectJ是靜態(tài)代理,故而能夠切入final修飾的類,abstract修飾的類;Spring AOP是動(dòng)態(tài)代理,其實(shí)現(xiàn)原理是通過CGLIB生成一個(gè)繼承了目標(biāo)類(委托類)的代理類,因此,final修飾的類不能被代理,同樣static和final修飾的方法也不會(huì)代理,因?yàn)閟tatic和final方法是不能被覆蓋的。在CGLIB底層,其實(shí)是借助了ASM這個(gè)非常強(qiáng)大的Java字節(jié)碼生成框架。關(guān)于CGLB和ASM的討論將會(huì)新開一個(gè)篇幅探討。
Spring AOP支持注解,在使用@Aspect注解創(chuàng)建和配置切面時(shí)將更加方便。而使用AspectJ,需要通過.aj文件來創(chuàng)建切面,并且需要使用ajc(Aspect編譯器)來編譯代碼;

Spring AOP我們可以使用Aspectj提供的注解;換句話說就是使用Aspectj的語法風(fēng)格,所以你在做springAop的時(shí)候@Aspect;@Before;@PonitCut等等這些注解其實(shí)都是Aspectj提供的,不是spring提供的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容