前言
每日一題專欄
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提供的