用ProxyFactoryBean建立AOP代理

來源:互聯網
上載者:User

標籤:

1、使用ProxyFactoryBean代理目標類的所有方法

<?xml version="1.0" encoding="UTF-8"?>  <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"  "http://www.springframework.org/dtd/spring-beans.dtd">    <beans>  <bean id="log" class="com.gc.action.LogAround"/>    <bean id="timeBook" class="com.gc.action.TimeBook"/>    <!--設定代理類-->    <bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean">                 <!--這裡代理的是介面-->          <property name="proxyInterfaces">              <value>com.gc.impl.TimeBookInterface</value>          </property>                   <!--是ProxyFactoryBean要代理的目標類-->          <property name="target">              <ref bean="timeBook"/>          </property>                   <!--程式中的Advice-->          <property name="interceptorNames">              <list>                  <value>log</value>              </list>          </property>      </bean>  </beans>

代碼說明:

   ●       id為log的Bean,是程式中的Advice。

   ●       id為timeBook的Bean,是ProxyFactoryBean要代理的目標類。

   ●       id為logProxy的Bean,就是ProxyFactoryBean。

 

   ●       ProxyFactoryBean的proxyInterfaces屬性,指明要代理的介面。

   ●       ProxyFactoryBean的target屬性,指明要代理的目標類 ,這個目標類實現了上面proxyInterfaces屬性指定的介面。

   ●       ProxyFactoryBean的interceptorNames屬性,指明要在代理的目標類中插入的Adivce 。

   ●        ProxyFactoryBean還有一個proxyTargetClass屬性,如果這個屬性被設定為“true”,說明  ProxyFactoryBean要代理的不是介面類,而是要使用CGLIB方式來進行代理,後面會詳細講解使用CGLIB方式來進行代理。

注意: ProxyFactoryBean的proxyInterfaces屬性只支援使用字串的方式進行注入,不支援使用Bean的依賴方式進行注入。

 

如果ProxyFactoryBean 的proxyInterfaces 屬性沒有 被設定,但是目標類實現了一個(或者更多) 介面,那麼ProxyFactoryBean 將自動檢測到這個目標類已經實現了至少一個介面, 一個基於JDK的代理將被建立 。被實際代理的介面將是目標類所實現的全部 介面;實際上,這和在proxyInterfaces 屬性中列出目標類實現的每個介面的情況是一樣的。然而,這將顯著地減少工作量以及輸入錯誤的可能性。

 

通知需要實現這幾個介面之一:


 

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

 

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

 

在 上面的樣本中,Advice會代理目標類的所有方法。如果要代理目標類的指定方法,則需要使用Spring提供的  org.springframework.aop.support.RegexpMethodPointcutAdvisor類。代理目標類的指定方法的 範例程式碼如下:

<?xml version="1.0" encoding="UTF-8"?>  <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"  "http://www.springframework.org/dtd/spring-beans.dtd">    <beans>  <bean id="log" class="com.gc.action.LogAround"/>    <bean id="timeBook" class="com.gc.action.TimeBook"/>    <!--代理目標類的指定方法-->  <bean id="logAdvisor"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">          <property name="advice">              <ref bean="log"/>          </property>                   <!--指定要代理的方法-->          <property name="patterns">              <value>.*doAuditing.* </value>          </property>      </bean>    <!--設定代理類-->  <bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean">            <property name="proxyInterfaces">              <value>com.gc.impl.TimeBookInterface</value>          </property>            <property name="target">              <ref bean="timeBook"/>          </property>            <property name="interceptorNames">              <list>                  <value>logAdvisor</value>              </list>          </property>      </bean>  </beans>

代碼說明:

   ●       在id為logAdvisor的Bean中設定Advice和要指定的方法。

   ●       把id為logProxy的Bean的interceptorNames屬性值改為logAdvisor。

   ●       logAdvisor的advice屬性指定Advice。

   ●       logAdvisor的patterns屬性指定要代理的方法。“.doAuditing”表示只有doAuditing()方法才使用指定的Advice。

patterns屬性值使用的是Regex,關於Regex的使用,下節將會進行講解。

注意: 因為要使用Regex,所以要把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


用ProxyFactoryBean建立AOP代理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.