使用Spring提供的類org.springframework.aop.framework.ProxyFactoryBean是建立AOP的最基本的方式 。 html
使用 ProxyFactoryBean 來建立 AOP 代理的最重要的優勢之一是 IoC 能夠管理通知和切入點。 這是一個很是的強大的功能,可以實現其餘 AOP 框架很難實現的特定的方法。例如,一個通知自己能夠引用應用對象(除了目標對象,它在任何 AOP 框架中均可以引用應用對象),這徹底得益於依賴注入所提供的可插入性。 java
一、使用ProxyFactoryBean代理目標類的全部方法 正則表達式
代碼說明: spring
● id爲log的Bean,是程序中的Advice。 框架
● id爲timeBook的Bean,是ProxyFactoryBean要代理的目標類。 ui
● id爲logProxy的Bean,就是ProxyFactoryBean。 spa
● ProxyFactoryBean的proxyInterfaces屬性,指明要代理的接口。 代理
● ProxyFactoryBean的target屬性,指明要代理的目標類 ,這個目標類實現了上面proxyInterfaces屬性指定的接口。 xml
● ProxyFactoryBean的interceptorNames屬性,指明要在代理的目標類中插入的Adivce 。 htm
● ProxyFactoryBean還有一個proxyTargetClass屬性,若是這個屬性被設定爲「true」,說明 ProxyFactoryBean要代理的不是接口類,而是要使用CGLIB方式來進行代理,後面會詳細講解使用CGLIB方式來進行代理。
注意: ProxyFactoryBean的proxyInterfaces屬性只支持使用字符串的方式進行注入,不支持使用Bean的依賴方式進行注入。
若是ProxyFactoryBean 的proxyInterfaces 屬性沒有 被設置,可是目標類實現了一個(或者更多) 接口,那麼ProxyFactoryBean 將自動檢測到這個目標類已經實現了至少一個接口, 一個基於JDK的代理將被建立 。被實際代理的接口將是目標類所實現的所有 接口;實際上,這和在proxyInterfaces 屬性中列出目標類實現的每一個接口的狀況是同樣的。然而,這將顯著地減小工做量以及輸入錯誤的可能性。
通知須要實現這幾個接口之一:
http://fruitking.iteye.com/blog/601106
二、使用ProxyFactoryBean代理目標類的指定方法
在 上面的示例中,Advice會代理目標類的全部方法。若是要代理目標類的指定方法,則須要使用Spring提供的 org.springframework.aop.support.RegexpMethodPointcutAdvisor類。代理目標類的指定方法的 示例代碼以下:
代碼說明:
● 在id爲logAdvisor的Bean中設定Advice和要指定的方法。
● 把id爲logProxy的Bean的interceptorNames屬性值改成logAdvisor。
● logAdvisor的advice屬性指定Advice。
● logAdvisor的patterns屬性指定要代理的方法。「.doAuditing」表示只有doAuditing()方法才使用指定的Advice。
patterns屬性值使用的是正則表達式,關於正則表達式的使用,下節將會進行講解。
注意: 由於要使用正則表達式,因此要把spring-framework-2.0-m1\lib\oro目錄下的
jakarta-oro-2.0.8.jar加入到ClassPath下
代理模式,JDK動態代理,SpringAOP前因後果
http://fruitking.iteye.com/blog/601106 (重要參考)
參考:http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ch07s05.html
http://hi.baidu.com/javasite/blog/item/8989280358d7ed723912bb1e.html/cmtid/700035c42f8f8da28226ac95
http://hi.baidu.com/ganlanzhi/blog/item/be1dd939234a06f63b87ce7a.html