Posted on 2009-08-08 22:01
kangaroo 閱讀(283)
評(píng)論(0) 編輯 收藏
用于實(shí)現(xiàn)AOP技術(shù)的主要策略,按照功能由弱到強(qiáng)排列:
-J2SE動(dòng)態(tài)代理
-動(dòng)態(tài)字節(jié)碼生成
-java代碼生成
-使用定制的類加載期
-語言擴(kuò)展
1.J2SE動(dòng)態(tài)代理
動(dòng)態(tài)代理是一種強(qiáng)大的語言結(jié)構(gòu),它使我們可以為一個(gè)或多個(gè)接口“憑空”地創(chuàng)建實(shí)現(xiàn)對(duì)象,而不需要預(yù)先有一個(gè)實(shí)現(xiàn)類。
動(dòng)態(tài)代理最大的好處在于:這是一種標(biāo)準(zhǔn)的Java語言特性。除了AOP框架之外不需要第三方庫,也不回受到應(yīng)用程序的任何影響。
動(dòng)態(tài)代理的最大局限性在于:它只能針對(duì)接口進(jìn)行代理,不能針對(duì)類。一般情況下,這種限制不是壞事,因?yàn)锳OP主要針對(duì)業(yè)務(wù)對(duì)象,而業(yè)務(wù)對(duì)象通常是放在業(yè)務(wù)接口之后。
動(dòng)態(tài)代理在java1.4和更高的版本性能表現(xiàn)地相對(duì)好,不過,一旦使用動(dòng)態(tài)代理的實(shí)習(xí)策略,便不可避免地招致反射調(diào)用的開銷。
2.動(dòng)態(tài)字節(jié)碼生成
為了針對(duì)Java類提供代理,我們需要?jiǎng)討B(tài)代理之外的工具,就是動(dòng)態(tài)字節(jié)碼生成。應(yīng)該慶幸,Java的反射和類裝載機(jī)制都非常開發(fā),因此實(shí)現(xiàn)動(dòng)態(tài)字節(jié)碼生成庫并不復(fù)雜。
在這方面,最流行的工具就是CGLIB(Code Generation Library)。在spring中,如果需要針對(duì)類(而不是接口)提供代理,就會(huì)用到CGLIB。它可以針對(duì)制定的類動(dòng)態(tài)生成一個(gè)子類,并覆蓋其中的方法,從而實(shí)現(xiàn)方法的攔截。CGLIB風(fēng)格的字節(jié)碼增強(qiáng)并應(yīng)用在Hibernate2.X版本中,并被證明是一種成熟的技術(shù)。Hibernate的成功表明,在應(yīng)用服務(wù)器環(huán)境下CGLIB沒有給最終用戶帶來任何困擾。
不過CGLIB有個(gè)小問題就是,因?yàn)樗峭ㄟ^生成類的子類來實(shí)現(xiàn)代理的,所以無法為final方法提供代理。
3.java代碼生成
逐漸退出流行。
4.使用定制的類加載器
5.語言擴(kuò)展
AspectJ就對(duì)java進(jìn)行了擴(kuò)展,將AOP概念作為一等公民來對(duì)待。