用ProxyFactoryBean建立AOP代理


 

使用Spring提供的類org.springframework.aop.framework.ProxyFactoryBean是建立AOP的最基本的方式 html

 

使用 ProxyFactoryBean 來建立 AOP 代理的最重要的優勢之一是 IoC 能夠管理通知和切入點。 這是一個很是的強大的功能,可以實現其餘 AOP 框架很難實現的特定的方法。例如,一個通知自己能夠引用應用對象(除了目標對象,它在任何 AOP 框架中均可以引用應用對象),這徹底得益於依賴注入所提供的可插入性。 java

 

一、使用ProxyFactoryBean代理目標類的全部方法 正則表達式


Java代碼   收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"  
  3. "http://www.springframework.org/dtd/spring-beans.dtd">  
  4.   
  5. <beans>  
  6. <bean id="log" class="com.gc.action.LogAround"/>  
  7.   
  8. <bean id="timeBook" class="com.gc.action.TimeBook"/>  
  9.   
  10. <!--設定代理類-->  
  11.   
  12. <bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean">  
  13.   
  14.              <!--這裏代理的是接口-->  
  15.         <property name="proxyInterfaces">  
  16.             <value>com.gc.impl.TimeBookInterface</value>  
  17.         </property>  
  18.   
  19.                <!--是ProxyFactoryBean要代理的目標類-->  
  20.         <property name="target">  
  21.             <ref bean="timeBook"/>  
  22.         </property>  
  23.   
  24.                <!--程序中的Advice-->  
  25.         <property name="interceptorNames">  
  26.             <list>  
  27.                 <value>log</value>  
  28.             </list>  
  29.         </property>  
  30.     </bean>  
  31. </beans>  

 

代碼說明: 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的依賴方式進行注入。

 

若是ProxyFactoryBeanproxyInterfaces 屬性沒有 被設置,可是目標類實現了一個(或者更多) 接口,那麼ProxyFactoryBean自動檢測到這個目標類已經實現了至少一個接口, 一個基於JDK的代理將被建立 。被實際代理的接口將是目標類所實現的所有 接口;實際上,這和在proxyInterfaces 屬性中列出目標類實現的每一個接口的狀況是同樣的。然而,這將顯著地減小工做量以及輸入錯誤的可能性。

 

通知須要實現這幾個接口之一:


 

http://fruitking.iteye.com/blog/601106

 

二、使用ProxyFactoryBean代理目標類的指定方法

 

在 上面的示例中,Advice會代理目標類的全部方法。若是要代理目標類的指定方法,則須要使用Spring提供的 org.springframework.aop.support.RegexpMethodPointcutAdvisor類。代理目標類的指定方法的 示例代碼以下:

Java代碼   收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"  
  3. "http://www.springframework.org/dtd/spring-beans.dtd">  
  4.   
  5. <beans>  
  6. <bean id="log" class="com.gc.action.LogAround"/>  
  7.   
  8. <bean id="timeBook" class="com.gc.action.TimeBook"/>  
  9.   
  10. <!--代理目標類的指定方法-->  
  11. <bean id="logAdvisor"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">  
  12.         <property name="advice">  
  13.             <ref bean="log"/>  
  14.         </property>  
  15.   
  16.                <!--指定要代理的方法-->  
  17.         <property name="patterns">  
  18.             <value>.*doAuditing.* </value>  
  19.         </property>  
  20.     </bean>  
  21.   
  22. <!--設定代理類-->  
  23. <bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean">  
  24.   
  25.         <property name="proxyInterfaces">  
  26.             <value>com.gc.impl.TimeBookInterface</value>  
  27.         </property>  
  28.   
  29.         <property name="target">  
  30.             <ref bean="timeBook"/>  
  31.         </property>  
  32.   
  33.         <property name="interceptorNames">  
  34.             <list>  
  35.                 <value>logAdvisor</value>  
  36.             </list>  
  37.         </property>  
  38.     </bean>  
  39. </beans>  

 

代碼說明:

   ●       在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

相關文章
相關標籤/搜索