靜態(tài)代理模式
?所謂靜態(tài)代理就是AOP框架會(huì)在編譯階段生成AOP代理類,因此也稱為編譯時(shí)增強(qiáng)。ApsectJ是靜態(tài)代理的實(shí)現(xiàn)之一,也是最為流行的。靜態(tài)代理由于在編譯時(shí)就生成了代理類,效率相比動(dòng)態(tài)代理要高一些。AspectJ可以單獨(dú)使用,也可以和Spring結(jié)合使用。
動(dòng)態(tài)代理模式
?與靜態(tài)代理不同,動(dòng)態(tài)代理就是說AOP框架不會(huì)去修改編譯時(shí)生成的字節(jié)碼,而是在運(yùn)行時(shí)在內(nèi)存中生成一個(gè)AOP代理對(duì)象,這個(gè)AOP對(duì)象包含了目標(biāo)對(duì)象的全部方法,并且在特定的切點(diǎn)做了增強(qiáng)處理,并回調(diào)原對(duì)象的方法。
?Spring AOP中的動(dòng)態(tài)代理主要有兩種方式:JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理。
?JDK代理通過反射來處理被代理的類,并且要求被代理類必須實(shí)現(xiàn)一個(gè)接口。核心類是 InvocationHandler接口 和 Proxy類。
?而當(dāng)目標(biāo)類沒有實(shí)現(xiàn)接口時(shí),Spring AOP框架會(huì)使用CGLIB來動(dòng)態(tài)代理目標(biāo)類。
?CGLIB(Code Generation Library),是一個(gè)代碼生成的類庫,可以在運(yùn)行時(shí)動(dòng)態(tài)的生成某個(gè)類的子類。CGLIB是通過繼承的方式做的動(dòng)態(tài)代理,因此如果某個(gè)類被標(biāo)記為final,那么它是無法使用CGLIB做動(dòng)態(tài)代理的。核心類是 MethodInterceptor 接口和Enhancer 類。