javascript
Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理:
???① JDK動(dòng)態(tài)代理只提供接口的代理,不支持類的代理,要求被代理類實(shí)現(xiàn)接口。JDK動(dòng)態(tài)代理的核心是InvocationHandler接口和Proxy類,在獲取代理對(duì)象時(shí),使用Proxy類來(lái)動(dòng)態(tài)創(chuàng)建目標(biāo)類的代理類(即最終真正的代理類,這個(gè)類繼承自Proxy并實(shí)現(xiàn)了我們定義的接口),當(dāng)代理對(duì)象調(diào)用真實(shí)對(duì)象的方法時(shí), InvocationHandler?通過(guò)invoke()方法反射來(lái)調(diào)用目標(biāo)類中的代碼,動(dòng)態(tài)地將橫切邏輯和業(yè)務(wù)編織在一起;
?InvocationHandler 的 invoke(Object??proxy,Method??method,Object[] args):proxy是最終生成的代理對(duì)象;??method 是被代理目標(biāo)實(shí)例的某個(gè)具體方法;??args 是被代理目標(biāo)實(shí)例某個(gè)方法的具體入?yún)? 在方法反射調(diào)用時(shí)使用。
????????② 如果被代理類沒有實(shí)現(xiàn)接口,那么Spring AOP會(huì)選擇使用CGLIB來(lái)動(dòng)態(tài)代理目標(biāo)類。CGLIB(Code Generation Library),是一個(gè)代碼生成的類庫(kù),可以在運(yùn)行時(shí)動(dòng)態(tài)的生成指定類的一個(gè)子類對(duì)象,并覆蓋其中特定方法并添加增強(qiáng)代碼,從而實(shí)現(xiàn)AOP。CGLIB是通過(guò)繼承的方式做的動(dòng)態(tài)代理,因此如果某個(gè)類被標(biāo)記為final,那么它是無(wú)法使用CGLIB做動(dòng)態(tài)代理的。
(3)靜態(tài)代理與動(dòng)態(tài)代理區(qū)別在于生成AOP代理對(duì)象的時(shí)機(jī)不同,相對(duì)來(lái)說(shuō)AspectJ的靜態(tài)代理方式具有更好的性能,但是AspectJ需要特定的編譯器進(jìn)行處理,而Spring AOP則無(wú)需特定的編譯器處理。
IoC讓相互協(xié)作的組件保持松散的耦合,而AOP編程允許你把遍布于應(yīng)用各層的功能分離出來(lái)形成可重用的功能組件。?
總結(jié)
以上是生活随笔為你收集整理的Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理:的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring的AOP理解
- 下一篇: Spring AOP里面的几个名词的概念