posts - 241,  comments - 116,  trackbacks - 0
          我們一直使用ProxyFactoryBean來顯式的創(chuàng)建AOP代理。但是在很多場合,這種方式將會使編寫配置文件的工作量大大增加;由于要從 ProxyFactoryBean獲得代理對象,也會使應(yīng)用和Spring之間的耦合度增加。下面介紹使用Spring提供的自動代理機(jī)制來解決這類問 題。

          1、使用BeanNameAutoProxyCreator

                 Spring提供的BeanNameAutoProxyCreator類允許我們通過Bean的name屬性來指定代理的Bean。它暴露了 java.lang.String[]類型的beanNames和 interceptorNames屬性。beanNames可以指定被代理的Bean名字列表,支持“*”通配符,例如“*DAO”表示所有名字以 “DAO”結(jié)尾的Bean。interceptorNames指定通知(Advice)列表,或者通知者(Advisor)列表。

                  下面通過一個例程來演示如何使用BeanNameAutoProxyCreator。在例子中,有兩個Bean:TestBeanA和BeanB,并在 TestMain類中的main方法中調(diào)用其MyMethod()方法。自動代理將會在方法調(diào)用前自動的執(zhí)行配置的前置通知,輸出提示信息。

          新建一個名字為AOP_Test4.10的工程,添加Spring的IoC和AOP庫后,新建一aop.test包,再分別創(chuàng)建兩個類TestBeanA和BeanB,添加MyMethod()方法,代碼如下:

          1. /** 
          2.  *  
          3.  */  
          4. package aop.test;  
          5. /** 
          6.  * @author zhangyong 
          7.  *  
          8.  */  
          9. public class TestBeanA {  
          10.      public void MyMethod() {  
          11.           System.out.println(this.getClass().getName()  
          12.                 + ".MyMethod() is run!");  
          13.      }  
          14. }  


          1. /** 
          2.  *  
          3.  */  
          4. package aop.test;    
          5. /** 
          6.  * @author zhangyong 
          7.  *  
          8.  */  
          9. public class BeanB {      
          10.     public void MyMethod() {  
          11.          System.out.println(this.getClass().getName()  
          12.                  + ".MyMethod() is run!");  
          13.     }  
          14. }  

            再創(chuàng)建前置通知類BeforeAdvice:

          1. /** 
          2.  *  
          3.  */  
          4. package aop.test;    
          5. import java.lang.reflect.Method;  
          6. import org.springframework.aop.MethodBeforeAdvice;    
          7. /** 
          8.  * @author zhangyong 
          9.  *  
          10.  */  
          11. public class BeforeAdvice implements MethodBeforeAdvice {    
          12.      public void before(Method method, Object[] args, Object target)  
          13.              throws Throwable {  
          14.          System.out.println(method.getName() + "(),將要運(yùn)行!");  
          15.      }  
          16. }  

            最后創(chuàng)建含有main方法的測試類TestMain:

          1. /** 
          2.  *  
          3.  */  
          4. package aop.test;  
          5.    
          6. import org.springframework.context.ApplicationContext;  
          7. import org.springframework.context.support.ClassPathXmlApplicationContext;    
          8. /** 
          9.  * @author zhangyong 
          10.  *  
          11.  */  
          12. public class TestMain {   
          13.      public static void main(String[] args) {  
          14.          ApplicationContext ac = new ClassPathXmlApplicationContext(  
          15.                  "applicationContext.xml");          
          16.          TestBeanA beanA = (TestBeanA)ac.getBean("TestBeanA");  
          17.          beanA.MyMethod();  
          18.          BeanB beanB = (BeanB)ac.getBean("BeanB");  
          19.          beanB.MyMethod();          
          20.      }  
          21.  }  

            在配置文件中配置Bean和自動代理Bean,完成后代碼如下:

          1. <?xml version="1.0" encoding="UTF-8"?>  
          2. <beans …………>   
          3.      <bean id="TestBeanA" class="aop.test.TestBeanA"/>  
          4.      <bean id="BeanB" class="aop.test.BeanB"/>    
          5.      <bean id="BeforeAdvice" class="aop.test.BeforeAdvice"></bean>  
          6.     
          7.      <bean class="org.springframework.aop.framework.autoproxy.  
          8.                        BeanNameAutoProxyCreator">  
          9.          <property name="beanNames">  
          10.              <list>  
          11.                  <value>Test*</value>  
          12.              </list>  
          13.          </property>  
          14.          <property name="interceptorNames">  
          15.              <list>  
          16.                  <value>BeforeAdvice</value>  
          17.              </list>  
          18.          </property>  
          19.      </bean>  
          20.  </beans>  

            運(yùn)行主類,輸出結(jié)果如下:

          AutoProxy1

            可以看到,在主類TestMain中,我們是直接從Spring IoC容器中獲取收管Bean而不是像以前那樣從ProxyFactoryBean中獲取代理,但是我們的前置通知BeforeAdvice仍然在 TestBeanA對象的MyMethod()方法執(zhí)行前被觸發(fā),這說明我們的自動代理正在工作。

           

          2、使用DefaultAdvisorAutoProxyCreator

            DefaultAdvisorAutoProxyCreator允許我們只需定義相應(yīng)的Advisor通知者,就可以完成自動代理。配 置好DefaultAdvisorAutoProxyCreator受管Bean后,它會自動查找配置文件中定義的Advisor,并將它們作用于所有的 Bean。

          修改例程4.10的配置文件,使用DefaultAdvisorAutoProxyCreator來完成自動代理。完成后配置文件代碼如下(本例完整工程代碼見例程4.11):

          1. <?xml version="1.0" encoding="UTF-8"?>  
          2. <beans ……>  
          3.      <bean id="TestBeanA" class="aop.test.TestBeanA" />  
          4.      <bean id="BeanB" class="aop.test.BeanB" />  
          5.      <bean id="BeforeAdvice" class="aop.test.BeforeAdvice"/>  
          6.      <bean class="org.springframework.aop.framework.autoproxy.  
          7.                    DefaultAdvisorAutoProxyCreator" />  
          8.     
          9.     <bean class="org.springframework.aop.support.NameMatchMethod  
          10.                                           PointcutAdvisor">  
          11.          <property name="advice" ref="BeforeAdvice" />  
          12.          <property name="mappedNames">  
          13.              <list>  
          14.                  <value>*Method*</value>  
          15.              </list>  
          16.          </property>  
          17.      </bean>      
          18.  </beans>  

            運(yùn)行主類輸出結(jié)果如下:

          AutoProxy2

          from:http://www.itstrike.cn/html/Java/Springjiaocheng/200812/02-1427.html

          posted on 2008-12-02 20:20 墻頭草 閱讀(340) 評論(0)  編輯  收藏 所屬分類: Spring
          人人游戲網(wǎng) 軟件開發(fā)網(wǎng) 貨運(yùn)專家
          主站蜘蛛池模板: 遵义县| 济宁市| 皮山县| 嘉黎县| 武清区| 丹东市| 中牟县| 保康县| 横山县| 东城区| 木兰县| 鄂托克旗| 德保县| 定南县| 拜泉县| 延边| 罗城| 洞头县| 科技| 临清市| 琼海市| 常熟市| 旬阳县| 灵石县| 黄冈市| 托里县| 绩溪县| 青海省| 孙吴县| 洪雅县| 合水县| 池州市| 黑水县| 陕西省| 军事| 黎平县| 腾冲县| 托里县| 隆回县| 松滋市| 稷山县|