<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    1、使用BeanNameAutoProxyCreator

           Spring提供的BeanNameAutoProxyCreator類允許我們通過Bean的name屬性來指定代理的Bean。它暴露了 java.lang.String[]類型的beanNames和 interceptorNames屬性。beanNames可以指定被代理的Bean名字列表,支持“*”通配符,例如“*DAO”表示所有名字以 “DAO”結尾的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() + "(),將要運行!");  
    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>  

      運行主類,輸出結果如下:

    AutoProxy1

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

     

    2、使用DefaultAdvisorAutoProxyCreator

      DefaultAdvisorAutoProxyCreator允許我們只需定義相應的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>  

      運行主類輸出結果如下:

    AutoProxy2

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

    posted on 2008-12-02 20:20 墻頭草 閱讀(339) 評論(0)  編輯  收藏 所屬分類: Spring
    人人游戲網(wǎng) 軟件開發(fā)網(wǎng) 貨運專家
    主站蜘蛛池模板: 嫩草影院在线免费观看| 无遮挡呻吟娇喘视频免费播放| a在线观看免费视频| 亚洲精品A在线观看| 人与动性xxxxx免费| 亚洲精品成a人在线观看| 美女免费视频一区二区三区| 国产美女精品久久久久久久免费| 久久亚洲精品国产精品婷婷| 四虎影院免费在线播放| 看全免费的一级毛片| 亚洲一区无码精品色| 永久免费不卡在线观看黄网站| 亚洲AV成人精品网站在线播放| 免费女人高潮流视频在线观看| 亚洲一区影音先锋色资源| 免费观看激色视频网站(性色)| 国产精品亚洲精品观看不卡| 四虎成人免费网址在线| 深夜久久AAAAA级毛片免费看| 2048亚洲精品国产| 久久久久久国产精品免费无码 | 亚洲精品国产精品乱码视色| 久久综合九色综合97免费下载| 亚洲高清日韩精品第一区| 日本精品人妻无码免费大全| 麻豆一区二区三区蜜桃免费| 亚洲一区无码中文字幕| 国产成人免费高清激情明星 | A国产一区二区免费入口| 亚洲电影免费在线观看| 毛片a级毛片免费播放下载| 国产精品成人啪精品视频免费| 91天堂素人精品系列全集亚洲| 成年午夜视频免费观看视频| 国产免费A∨在线播放| 亚洲日本在线免费观看| 亚洲精品国产高清不卡在线| 四虎免费影院ww4164h| www永久免费视频| 亚洲免费在线视频播放|