Spring - Java/J2EE Application Framework 应用框架 第 6 章 集成AspectJ
第?6?章?集成AspectJ
6.1.?概述
Spring基于代理的AOP框架很適合處理一般的中間件和特定應(yīng)用的問(wèn)題。 然而,有時(shí),更強(qiáng)大的AOP方案也是需要的,例如,如果我們需要給一個(gè)類增加 額外的字段, 或者通知(Advise)一個(gè)不是由Spring IoC容器創(chuàng)建的細(xì)粒度的對(duì)象。
We recommend the use of AspectJ in such cases. Accordingly, as of version 1.1, Spring provides a powerful integration with AspectJ.
因?yàn)镾pring很好的整合了AspectJ,所以這種情況下我們推薦使用AspectJ。
6.2.?使用Spring IoC配置AspectJ
Spring/AspectJ集成最重要的部分是允許Spring的依賴注射來(lái)配置AspectJ的aspect。 這給方面(aspect)和對(duì)象(object)帶來(lái)了類似的好處。例如:
-
Aspect不需要使用特定的配置機(jī)制;它們可以使用和整個(gè)應(yīng)用相同的、一致的方法來(lái)配置。
-
?Aspect可以依賴應(yīng)用對(duì)象。例如,一個(gè)權(quán)限aspect可以依賴一個(gè)權(quán)限管理對(duì)象,稍后我們可以看到例子。
-
可以通過(guò)相關(guān)的Spring上下文(Context)獲得一個(gè)aspect的引用(reference),這可以允許動(dòng)態(tài)的aspect配置。
AspectJ 的方式可以通過(guò)設(shè)值方式(setter)的注入Java Bean的屬性,也可以通過(guò)實(shí)現(xiàn)Spring的生命周期接口來(lái)實(shí)現(xiàn),例如實(shí)現(xiàn)?BeanFactoryAware。
值得注意的是,AspectJ不能使用構(gòu)造器注入方式和方法注入方式, 這是由于aspect沒有類似對(duì)象的構(gòu)造器那樣可以調(diào)用方法的原因。6.2.1.?“單例”aspect
大多數(shù)情況下,AspectJ的aspect是單例的,每個(gè)類裝載器一個(gè)實(shí)例, 這個(gè)單一的實(shí)例負(fù)責(zé)通知(advising)多個(gè)對(duì)象實(shí)例。
Spring IoC容器不能實(shí)例化aspect,因?yàn)?#xff0c;aspect沒有可調(diào)用的構(gòu)造器。 但是,它可以使用AspectJ為所有aspect定義的靜態(tài)方法aspectOf()獲得一個(gè) aspect的引用,并且,能夠把依賴注入aspect。
6.2.1.1.?舉例
考慮一個(gè)關(guān)于安全的aspect,它依賴于一個(gè)安全管理對(duì)象。這個(gè)aspect應(yīng)用于 Account類中實(shí)例變量balance的所有的值變化。(我們不能夠以同樣方法使 用Spring AOP做到這點(diǎn)。)
AspectJ中aspect的代碼(Spring/AspectJ的一個(gè)例子),顯示如下。注意, 對(duì)SecurityManager接口的依賴在Java Bean的屬性中說(shuō)明。
public aspect BalanceChangeSecurityAspect { private SecurityManager securityManager; public void setSecurityManager(SecurityManager securityManager) { this.securityManager = securityManager; } private pointcut balanceChanged() : set(int Account.balance); before() : balanceChanged() { this.securityManager.checkAuthorizedToModify(); } }我們配置這個(gè)aspect的方式和普通類是一樣的。注意,我們?cè)O(shè)置屬性引用 的方式是完全相同的。注意,我們必須使用factory-method屬性來(lái)指定使用 aspectOf()靜態(tài)方法”創(chuàng)建”這個(gè)aspect。實(shí)際上,是定位(locating), 而非創(chuàng)建(creating)這個(gè)aspect,但Spring容器不關(guān)心這些。
<bean id="securityAspect" class="org.springframework.samples.aspectj.bank.BalanceChangeSecurityAspect" factory-method="aspectOf" > <property name="securityManager"> <ref local="securityManager"/> </property> </bean>我們不需要在Spring配置中做任何事情去定位(target)這個(gè)aspect。 在這個(gè)aspect的控制適用地方的AspectJ代碼里,包含了切入點(diǎn)(pointcut) 的信息。這樣它甚至能夠適用于不被Spring IoC容器管理的對(duì)象。
6.2.1.2.?排序問(wèn)題
待完成
6.2.2.?非單例aspect
** 按每個(gè)目標(biāo)完成資料,等等。(Complete material on per target etc)
6.2.3.?3.4 轉(zhuǎn)向(Gotchas)
待完成
- 單例問(wèn)題
6.3.?使用AspectJ切點(diǎn)定位Spring的建議
在Spring將來(lái)的版本中,我們計(jì)劃支持在Spring XML或者其它的Bean定義 文件中使用AspectJ的切入點(diǎn)表達(dá)式來(lái)定位Spring通知(advice)。這將允許 AspectJ切入點(diǎn)模型的某些能力被應(yīng)用在Spring基于代理的AOP框架。這將可以在 純Java中工作,并且不需要AspectJ編譯器。僅僅AspectJ切入點(diǎn)相關(guān)的方法調(diào)用的 子集是可用的。
這個(gè)特性計(jì)劃在Spring 1.2版本中提供,它有賴于AspectJ的增強(qiáng)。
這個(gè)特性替代了我們先前為Spring創(chuàng)建一個(gè)切入點(diǎn)表達(dá)式語(yǔ)言的計(jì)劃。
6.4.?Spring提供給AspectJ的aspect
在將來(lái)的Spring版本中(可能是1.2),我們將加入一些Spring的服務(wù)作為 AspectJ的aspect,像聲明性事務(wù)服務(wù)。這將允許AspectJ的用戶使用這些服務(wù), 而無(wú)需潛在地依賴于Spring的AOP框架,甚至,不必依賴Spring IoC容器。
AspectJ的用戶可能比Spring用戶對(duì)這個(gè)特性更感興趣。
from:?http://docs.huihoo.com/spring/zh-cn/aspectj.html
總結(jié)
以上是生活随笔為你收集整理的Spring - Java/J2EE Application Framework 应用框架 第 6 章 集成AspectJ的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring - Java/J2EE A
- 下一篇: Spring - Java/J2EE A