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

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

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

    風(fēng)人園

    弱水三千,只取一瓢,便能解渴;佛法無(wú)邊,奉行一法,便能得益。
    隨筆 - 99, 文章 - 181, 評(píng)論 - 56, 引用 - 0
    數(shù)據(jù)加載中……

    SOP入門---第一個(gè)Spring AOP程式

      來(lái)使用Spring的AOP框架來(lái)重新撰寫之前「從代理機(jī)制初探AOP」主題中的程式,首先,Spring AOP預(yù)設(shè)使用動(dòng)態(tài)代理來(lái)實(shí)作AOP,動(dòng)態(tài)代理必須宣告被代理物件的介面:

     代碼:

    IHello.java
    								package onlyfun.caterpillar; 
    
    publicinterface IHello { 
        public void hello(String name); 
        public void morning(String name); 
    }

      實(shí)作IHello介面的HelloSpeaker則如下:

     代碼:

    HelloSpeaker.java
    								package onlyfun.caterpillar; 
    
    public class HelloSpeaker implements IHello { 
        public void hello(String name) { 
            System.out.println("Hello, " + name); 
        } 
    
        public void morning(String name) { 
            System.out.println("Morning, " + name); 
        } 
    }

      我們希望在方法執(zhí)行前後進(jìn)行記錄的動(dòng)作,在AOP中這需要Around類型的Advice,通常的,實(shí)作Around類型的策略是使用Interceptor。

      Interceptor的一個(gè)例子是Servlet中的Filter機(jī)制,在Filter機(jī)制下,當(dāng)請(qǐng)求來(lái)臨時(shí),會(huì)被Filter先攔截並進(jìn)行處理,之後傳給下一個(gè)Filter,最後才是真正處理請(qǐng)求的Servlet。實(shí)作AOP時(shí)所使用的Interceptor策略與Filter類似,所不同的是Filter被綁定於Servlet API,且只適用於請(qǐng)求階段。

      您可以將一連串的Interceptor想成是堆疊結(jié)構(gòu),在Spring中,在真正執(zhí)行某個(gè)方法前,會(huì)先插入Interceptor,每個(gè)Interceptor會(huì)執(zhí)行自己的處理,然後再執(zhí)行proceed,這將執(zhí)行流程轉(zhuǎn)給下一個(gè)Interceptor,如果沒(méi)有下一個(gè)Interceptor了,就執(zhí)行真正呼叫的方法,方法執(zhí)行過(guò)後,再一層一層返回Interceptor堆疊,最後離開堆疊,如下圖,流程先是紅色,方法執(zhí)行後的流程是藍(lán)色:

     代碼:

    <-- --> interceptor1 <-- --> interceptor2 <-- --> ..... <-- --> Invoked method

      Spring在實(shí)作Interceptor時(shí),是實(shí)作org.aopalliance.intercept.MethodInterceptor,AOP Alliance(http://www.sourceforge.net/projects/aopalliance)的目標(biāo)是制定AOP功能的標(biāo)準(zhǔn)介面,目前只提供一部份的子集合,子集包括了Interceptor,Spring實(shí)作MethodInterceptor,以求將來(lái)Interceptor的可移植性。

      我們實(shí)作LogInterceptor如下:

     代碼:

    LogInterceptor.java
    								package onlyfun.caterpillar; 
    
    import org.aopalliance.intercept.MethodInterceptor; 
    import org.aopalliance.intercept.MethodInvocation; 
    import java.util.logging.*; 
    
    public class LogInterceptor implements MethodInterceptor { 
        private Logger logger = Logger.getLogger(this.getClass().getName()); 
        
       publicObject invoke(MethodInvocation methodInvocation) throws Throwable { 
            logger.log(Level.INFO, "method starts..." + methodInvocation.getMethod()); 
            try { 
              Object result = methodInvocation.proceed(); 
              return result; 
            } 
            finally { 
                logger.log(Level.INFO, "method ends..." + methodInvocation.getMethod() + "\n"); 
            }        
       } 
    }

      invoke()中的MethodInvocation參數(shù)包括了下一個(gè)Interceptor的資訊、被執(zhí)行的方法、以及方法所需的參數(shù),其返回值是被呼叫方法的返回值。

      我們還需要一個(gè)代理物件,這可以使用org.springframework.aop.framework.ProxyFactoryBean,它需要知道代理的介面與物件,以及所要介入的Interceptor,如下:

     代碼:

    <?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="logInterceptor" class="onlyfun.caterpillar.LogInterceptor"/> 
    
        <bean id="helloSpeaker" class="onlyfun.caterpillar.HelloSpeaker"/> 
        
        <bean id="helloProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> 
            <property name="proxyInterfaces"> 
                <value>onlyfun.caterpillar.IHello</value> 
            </property> 
            <property name="target"> 
                <ref bean="helloSpeaker"/> 
            </property> 
            <property name="interceptorNames"> 
                <list> 
                    <value>logInterceptor</value> 
                </list> 
            </property> 
        </bean> 
    </beans>

      Interceptor執(zhí)行的順序是interceptorNames中設(shè)定的順序,最後是target目標(biāo)物件,使用下面的程式來(lái)測(cè)試一下:

     代碼:

    SpringTest.java
    								package onlyfun.caterpillar; 
    
    import org.springframework.context.*; 
    import org.springframework.context.support.*; 
    
    public class SpringTest { 
       publicstatic void main(String[] args) { 
            ApplicationContext context = new FileSystemXmlApplicationContext("bean.xml"); 
            IHello helloProxy = (IHello) context.getBean("helloProxy"); 
            helloProxy.hello("Justin"); 
            helloProxy.morning("momor"); 
        } 
    }

      執(zhí)行結(jié)果如下:

     代碼:

    2004/11/26 上午 11:59:09 onlyfun.caterpillar.LogInterceptor invoke 
    資訊: method starts...publicabstract void onlyfun.caterpillar.IHello.hello(java.lang.String) 
    Hello, Justin 
    2004/11/26 上午 11:59:09 onlyfun.caterpillar.LogInterceptor invoke 
    資訊: method ends...publicabstract void onlyfun.caterpillar.IHello.hello(java.lang.String) 
    
    2004/11/26 上午 11:59:09 onlyfun.caterpillar.LogInterceptor invoke 
    資訊: method starts...publicabstract void onlyfun.caterpillar.IHello.morning(java.lang.String) 
    Morning, momor 
    2004/11/26 上午 11:59:09 onlyfun.caterpillar.LogInterceptor invoke 
    資訊: method ends...publicabstract void onlyfun.caterpillar.IHello.morning(java.lang.String)

      完成了第一個(gè)Spring AOP程式了,不過(guò)這當(dāng)中還有許多細(xì)節(jié)可以說(shuō)明,下一個(gè)主題再繼續(xù)。

    posted on 2006-06-20 15:42 風(fēng)人園 閱讀(802) 評(píng)論(1)  編輯  收藏 所屬分類: Spring

    評(píng)論

    # re: SOP入門---第一個(gè)Spring AOP程式 [未登錄](méi)  回復(fù)  更多評(píng)論   

    非常感謝,我找的就是這個(gè)
    2012-06-07 09:59 | brave
    主站蜘蛛池模板: 日本免费人成黄页在线观看视频 | 亚洲人成在线播放网站岛国| 在线免费观看一级毛片| 免费在线看污视频| 日韩在线观看免费完整版视频| 在线亚洲午夜片AV大片| 久久精品国产亚洲av麻豆色欲 | 国产大陆亚洲精品国产| 亚洲人成毛片线播放| 亚洲an天堂an在线观看| 成人午夜亚洲精品无码网站| 国产精品视频免费一区二区三区| 成人免费的性色视频| 91精品手机国产免费| 国产羞羞的视频在线观看免费| 又长又大又粗又硬3p免费视频| 色婷婷六月亚洲综合香蕉| 亚洲一区动漫卡通在线播放| 日韩亚洲AV无码一区二区不卡| 久久久久久a亚洲欧洲aⅴ| 在线精品亚洲一区二区小说 | 国产乱子伦精品免费视频| 老司机免费午夜精品视频| 亚洲男同gay片| 亚洲综合精品第一页| 亚洲一区二区三区国产精品无码| 亚洲色图.com| 亚洲色av性色在线观无码| 亚洲日本在线免费观看| 亚洲性色成人av天堂| 亚洲男人天堂影院| 亚洲国产成人在线视频| 亚洲一级毛片免观看| 亚洲七久久之综合七久久| 最新国产精品亚洲| 亚洲成AV人影片在线观看| 大桥未久亚洲无av码在线| 特级av毛片免费观看| 亚洲精品视频免费观看| 香蕉视频在线免费看| 在线观看免费无码专区|