?????? 說真的,對于spring提供AOP的功能,個(gè)人實(shí)在不敢太過于恭維。主要是Spring的AOP功能沒那么強(qiáng)大,而且必須是對于spring容器管理的bean才能實(shí)施AOP功能,對于容器外的bean就無能為力了。而且spring沒有提供屬性的AOP功能。在這些方面,spring AOP真的不能和Aspectj相比。Aspectj的AOP功能才真的是真正意義的AOP框架,提供的功能非常強(qiáng)大,幾乎可以實(shí)現(xiàn)任何類型的AOP。不過Aspectj的學(xué)習(xí)曲線相對要比spring AOP稍微陡峭一點(diǎn),主要是spring AOP可以當(dāng)成普通javabean來處理,而Aspectj還要另外做編譯器,比較麻煩。不過,慶幸的是,eclipse下面有Aspectj插件,開發(fā)起來也是很方便。所以一般,復(fù)雜的AOP功能,還是推薦用Aspectj
???? 對于一般的J2EE開發(fā)來說,要實(shí)現(xiàn)一些比較常用的AOP,Spring 還是能滿足的。比如事務(wù)、異常、日志、權(quán)限等等,在這些方面,spring AOP還是比較方便的,特別是事務(wù)處理,spring提供了相當(dāng)好的集成。如果事務(wù)處理用Aspectj來實(shí)現(xiàn),不見得好多少。
??? 一直以來,覺得spring AOP最好用的一個(gè)地方就是提供了BeanNameAutoProxyCreator,這個(gè)類真的非常方便,以至于個(gè)人一旦遇到要實(shí)現(xiàn)AOP,首先就是求組于BeanNameAutoProxyCreator,如果BeanNameAutoProxyCreator實(shí)現(xiàn)不了,再考慮別的。不過,一般情況來說,BeanNameAutoProxyCreator的確能滿足需要了,除非你的需求真的千奇百怪。
???在應(yīng)用spring AOP功能時(shí),優(yōu)先考慮用接口。因?yàn)槿绻媒涌诘脑挘敲磗pring會(huì)創(chuàng)建一個(gè)代理,并在代理里面實(shí)現(xiàn)AOP增強(qiáng)代碼,并調(diào)用真正的實(shí)例對象。不過,spring AOP功能不一定非要用接口,一些普通類也是可以的。對于普通類,spring會(huì)用CGLIB來動(dòng)態(tài)生成一個(gè)新類。并且CGLIB會(huì)保持一個(gè)生成類的cache,因此它不會(huì)一直生成新類。spring使用ProxyCallbackFilter對象把其它對象放進(jìn)map進(jìn)行管理。如果沒有管理好cache,將會(huì)產(chǎn)生大量的java對象,直至出現(xiàn)OutOfMemoryErrors。因此使用spring的aop時(shí),一定要正確實(shí)現(xiàn)equals and hashCode。
???不過,不管怎么樣,在應(yīng)用spring AOP時(shí),還是優(yōu)先考慮接口方式,畢竟面向接口方式還是值得推薦的一個(gè)編程思想。
posted on 2006-07-31 19:37
jspark 閱讀(4111)
評論(11) 編輯 收藏