熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Spring自動代理機制

2022-06-13   來源: Java開源技術 

  我們一直使用ProxyFactoryBean來顯式的創建AOP代理但是在很多場合這種方式將會使編寫配置文件的工作量大大增加由於要從ProxyFactoryBean獲得代理對象也會使應用和Spring之間的耦合度增加下面介紹使用Spring提供的自動代理機制來解決這類問題

  使用BeanNameAutoProxyCreator

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

  下面通過一個例程來演示如何使用BeanNameAutoProxyCreator在例子中有兩個BeanTestBeanA和BeanB並在TestMain類中的main方法中調用其MyMethod()方法自動代理將會在方法調用前自動的執行配置的前置通知輸出提示信息

  新建一個名字為AOP_Test的工程添加Spring的IoC和AOP庫後新建一aoptest包再分別創建兩個類TestBeanA和BeanB添加MyMethod()方法代碼如下




代碼   查看源代碼copy to clipboard打印

    /**  
     *   
     */  
    package aoptest;   
    /**  
     * @author zhangyong  
     *   
     */  
    public class TestBeanA {   
         public void MyMethod() {   
              Systemoutprintln(thisgetClass()getName()   
                    + MyMethod() is run!);   
         }   
    }   





代碼   查看源代碼copy to clipboard打印

    /**  
     *   
     */  
    package aoptest;     
    /**  
     * @author zhangyong  
     *   
     */  
    public class BeanB {       
        public void MyMethod() {   
             Systemoutprintln(thisgetClass()getName()   
                     + MyMethod() is run!);   
        }   
    }   

  再創建前置通知類BeforeAdvice




代碼   查看源代碼copy to clipboard打印

    /**  
     *   
     */  
    package aoptest;     
    import javalangreflectMethod;   
    import orgspringframeworkaopMethodBeforeAdvice;     
    /**  
     * @author zhangyong  
     *   
     */  
    public class BeforeAdvice implements MethodBeforeAdvice {     
         public void before(Method method Object[] args Object target)   
                 throws Throwable {   
             Systemoutprintln(methodgetName() + ()將要運行!);   
         }   
    }   

  最後創建含有main方法的測試類TestMain




代碼   查看源代碼copy to clipboard打印

    /**  
     *   
     */  
    package aoptest;   
        
    import orgntextApplicationContext;   
    import orgntextsupportClassPathXmlApplicationContext;     
    /**  
     * @author zhangyong  
     *   
     */  
    public class TestMain {    
         public static void main(String[] args) {   
             ApplicationContext ac = new ClassPathXmlApplicationContext(   
                     applicationContextxml);           
             TestBeanA beanA = (TestBeanA)acgetBean(TestBeanA);   
             beanAMyMethod();   
             BeanB beanB = (BeanB)acgetBean(BeanB);   
             beanBMyMethod();           
         }   
     }   

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




代碼   查看源代碼copy to clipboard打印

    <?xml version= encoding=UTF?>  
    <beans …………>    
         <bean id=TestBeanA class=aoptestTestBeanA/>  
         <bean id=BeanB class=aoptestBeanB/>     
         <bean id=BeforeAdvice class=aoptestBeforeAdvice></bean>  
         
         <bean class=orgspringframeworkaopframeworkautoproxy   
                           BeanNameAutoProxyCreator>  
             <property name=beanNames>  
                 <list>  
                     <value>Test*</value>  
                 </list>  
             </property>  
             <property name=interceptorNames>  
                 <list>  
                     <value>BeforeAdvice</value>  
                 </list>  
             </property>  
         </bean>  
     </beans>  

  運行主類輸出結果如下

  AutoProxy1

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

  

  使用DefaultAdvisorAutoProxyCreator

  DefaultAdvisorAutoProxyCreator允許我們只需定義相應的Advisor通知者就可以完成自動代理配置好DefaultAdvisorAutoProxyCreator受管Bean後它會自動查找配置文件中定義的Advisor並將它們作用於所有的Bean

  修改例程的配置文件使用DefaultAdvisorAutoProxyCreator來完成自動代理完成後配置文件代碼如下(本例完整工程代碼見例程




代碼   查看源代碼copy to clipboard打印

    <?xml version= encoding=UTF?>  
    <beans ……>  
         <bean id=TestBeanA class=aoptestTestBeanA />  
         <bean id=BeanB class=aoptestBeanB />  
         <bean id=BeforeAdvice class=aoptestBeforeAdvice/>  
         <bean class=orgspringframeworkaopframeworkautoproxy   
                       DefaultAdvisorAutoProxyCreator />  
         
        <bean class=orgspringframeworkaopsupportNameMatchMethod   
                                              PointcutAdvisor>  
             <property name=advice ref=BeforeAdvice />  
             <property name=mappedNames>  
                 <list>  
                     <value>*Method*</value>  
                 </list>  
             </property>  
         </bean>       
     </beans>  

  運行主類輸出結果如下

  AutoProxy2


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28048.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.