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

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

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

    我的漫漫程序之旅

    專注于JavaWeb開發(fā)
    隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0
    數(shù)據(jù)加載中……

    Spring AOP初探

     AOP正在成為軟件開發(fā)的下一個圣杯。使用AOP,你可以將處理aspect的代碼注入主程序,通常主程序的主要目的并不在于處理這些aspect。AOP可以防止代碼混亂。
    為了理解AOP如何做到這點,考慮一下記日志的工作。日志本身不太可能是你開發(fā)的主程序的主要任務(wù)。如果能將“不可見的”、通用的日志代碼注入主程序中,那該多好啊。AOP可以幫助你做到。
    Spring framework是很有前途的AOP技術(shù)。作為一種非侵略性的,輕型的AOP framework,你無需使用預(yù)編譯器或其他的元標(biāo)簽,便可以在Java程序中使用它。這意味著開發(fā)團隊里只需一人要對付AOP framework,其他人還是象往常一樣編程。
    AOP是很多直覺難以理解的術(shù)語的根源。幸運的是,你只要理解三個概念,就可以編寫AOP模塊。這三個概念是:advice,pointcut和 advisor。advice是你想向別的程序內(nèi)部不同的地方注入的代碼。pointcut定義了需要注入advice的位置,通常是某個特定的類的一個 public方法。advisor是pointcut和advice的裝配器,是將advice注入主程序中預(yù)定義位置的代碼。

    既然我們知道了需要使用advisor向主要代碼中注入“不可見的”advice,讓我們實現(xiàn)一個Spring AOP的例子。在這個例子中,我們將實現(xiàn)一個before advice,這意味著advice的代碼在被調(diào)用的public方法開始前被執(zhí)行。以下是這個before advice的實現(xiàn)代碼:

    package com.company.springaop.test; 

    import java.lang.reflect.Method; 
    import org.springframework.aop.MethodBeforeAdvice; 

    public class TestBeforeAdvice implements MethodBeforeAdvice 

      
    public void before(Method m, Object[] args, Object target) 
      
    throws Throwable 
        System.out.println(
    "Hello world! (by " 
            
    + this.getClass().getName() 
            
    + ")"); 
      }
     
    }
     


    接口MethodBeforeAdvice只有一個方法before需要實現(xiàn),它定義了advice的實現(xiàn)。before方法共用三個參數(shù),它們提供了相當(dāng)豐富的信息。參數(shù)Method m是advice開始后執(zhí)行的方法。方法名稱可以用作判斷是否執(zhí)行代碼的條件。Object[] args是傳給被調(diào)用的public方法的參數(shù)數(shù)組。當(dāng)需要記日志時,參數(shù)args和被執(zhí)行方法的名稱,都是非常有用的信息。你也可以改變傳給m的參數(shù),但要小心使用這個功能;編寫最初主程序的程序員并不知道主程序可能會和傳入?yún)?shù)的發(fā)生沖突。Object target是執(zhí)行方法m對象的引用。

    在下面的BeanImpl類中,每個public方法調(diào)用前,都會執(zhí)行advice:

    package com.company.springaop.test; 

    public class BeanImpl implements Bean 

      
    public void theMethod() 
        System.out.println(
    this.getClass().getName() 
            
    + "." + new Exception().getStackTrace()[0].getMethodName() 
            
    + "()" 
            
    + " says HELLO!"); 
      }
     
    }


    類BeanImpl實現(xiàn)了下面的接口Bean:

    package com.company.springaop.test; 

    public interface Bean 
      
    public void theMethod(); 
    }



    雖然不是必須使用接口,但面向接口而不是面向?qū)崿F(xiàn)編程是良好的編程實踐,Spring也鼓勵這樣做。

    pointcut和advice通過配置文件來實現(xiàn),因此,接下來你只需編寫主方法的Java代碼:
    package com.company.springaop.test; 

    import org.springframework.context.ApplicationContext; 
    import org.springframework.context.support.FileSystemXmlApplicationContext; 

    public class Main 

      
    public static void main(String[] args) 
        
    //Read the configuration file 
        ApplicationContext ctx 
            
    = new FileSystemXmlApplicationContext("springconfig.xml"); 

        
    //Instantiate an object 
        Bean x = (Bean) ctx.getBean("bean"); 

        
    //Execute the public method of the bean (the test) 
        x.theMethod(); 
      }
     
    }



    我們從讀入和處理配置文件開始,接下來馬上要創(chuàng)建它。這個配置文件將作為粘合程序不同部分的“膠水”。讀入和處理配置文件后,我們會得到一個創(chuàng)建工廠ctx。任何一個Spring管理的對象都必須通過這個工廠來創(chuàng)建。對象通過工廠創(chuàng)建后便可正常使用。

    僅僅用配置文件便可把程序的每一部分組裝起來。
    <?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE beans PUBLIC  "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 

    <beans> 
      
    <!--CONFIG--> 
      
    <bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean"> 
        
    <property name="proxyInterfaces"> 
          
    <value>com.company.springaop.test.Bean</value> 
        
    </property> 
        
    <property name="target"> 
          
    <ref local="beanTarget"/> 
        
    </property> 
        
    <property name="interceptorNames"> 
          
    <list> 
            
    <value>theAdvisor</value> 
          
    </list> 
        
    </property> 
      
    </bean> 

      
    <!--CLASS--> 
      
    <bean id="beanTarget" class="com.company.springaop.test.BeanImpl"/> 

      
    <!--ADVISOR--> 
      
    <!--Note: An advisor assembles pointcut and advice--> 
      
    <bean id="theAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> 
        
    <property name="advice"> 
          
    <ref local="theBeforeAdvice"/> 
        
    </property> 
        
    <property name="pattern"> 
          
    <value>com\.company\.springaop\.test\.Bean\.theMethod</value> 
        
    </property> 
      
    </bean> 

      
    <!--ADVICE--> 
      
    <bean id="theBeforeAdvice" class="com.company.springaop.test.TestBeforeAdvice"/> 
    </beans> 


    四個bean定義的次序并不重要。我們現(xiàn)在有了一個advice,一個包含了正則表達(dá)式pointcut的advisor,一個主程序類和一個配置好的接口,通過工廠ctx,這個接口返回自己本身實現(xiàn)的一個引用。

    BeanImpl和TestBeforeAdvice都是直接配置。我們用一個唯一的ID創(chuàng)建一個bean元素,并指定了一個實現(xiàn)類。這就是全部的工作。

    advisor通過Spring framework提供的一個RegexMethodPointcutAdvisor類來實現(xiàn)。我們用advisor的一個屬性來指定它所需的 advice-bean。第二個屬性則用正則表達(dá)式定義了pointcut,確保良好的性能和易讀性。

    最后配置的是bean,它可以通過一個工廠來創(chuàng)建。bean的定義看起來比實際上要復(fù)雜。bean是ProxyFactoryBean的一個實現(xiàn),它是Spring framework的一部分。這個bean的行為通過一下的三個屬性來定義:


    • 屬性proxyInterface定義了接口類。
    • 屬性target指向本地配置的一個bean,這個bean返回一個接口的實現(xiàn)。
    • 屬性interceptorNames是唯一允許定義一個值列表的屬性。這個列表包含所有需要在beanTarget上執(zhí)行的advisor。注意,advisor列表的次序是非常重要的。


    Spring工具

    雖然你可以手工修改Ant構(gòu)建腳本,但使用SpringUI(譯注:SpringUI現(xiàn)在是Spring framework的一部分,并改名為spring-ide),使用Spring AOP變得很簡單,只要點點鼠標(biāo)即可。你可以把SpringUI安裝成Eclipse的一個plug-in。然后,你只需在你的project上右擊鼠標(biāo),并選擇“add Spring Project Nature”。在project屬性中,你可以在“Spring Project”下添加Spring配置文件。在編譯前把下面的類庫加入project:aopalliance.jar,commons- logging.jar,jakarta-oro-2.0.7.jar和spring.jar。運行程序時你會看到下面的信息:

     (logging information) 
    Hello world! (by com.company.springaop.test.TestBeforeAdvice) 
    com.company.springaop.test.BeanImpl.theMethod() says HELLO! 



    優(yōu)點和缺點

    Spring比起其他的framework更有優(yōu)勢,因為除了AOP以外,它提供了更多別的功能。作為一個輕型framework,它在J2EE 不同的部分都可以發(fā)揮作用。因此,即使不想使用Spring AOP,你可能還是想使用Spring。另一個優(yōu)點是,Spring并不要求開發(fā)團隊所有的人員都會用它。學(xué)習(xí)Spring應(yīng)該從Spring reference的第一頁開始。讀了本文后,你應(yīng)該可以更好地理解Spring reference了。Spring唯一的缺點是缺乏更多的文檔,但它的mailing list是個很好的補充,而且會不斷地出現(xiàn)更多的文檔。
     


    posted on 2007-12-31 21:48 々上善若水々 閱讀(899) 評論(0)  編輯  收藏 所屬分類: Spring

    主站蜘蛛池模板: 99xxoo视频在线永久免费观看| 亚洲精品视频在线免费| 一区二区三区免费看| 在线观看无码AV网站永久免费| 亚洲精品无码专区久久| 免费中文字幕一级毛片| 久久精品乱子伦免费| 亚洲最大激情中文字幕| 亚洲精品免费在线| MM1313亚洲国产精品| 日韩免费观看的一级毛片| 成人亚洲国产va天堂| 无码国产精品一区二区免费式直播 | 久久国产乱子伦精品免费不卡| 亚洲三级中文字幕| 亚洲精品国产V片在线观看| 色欲色欲天天天www亚洲伊| 亚洲日本在线观看视频| 日本三级2019在线观看免费| 三级片免费观看久久| 久久久久国产成人精品亚洲午夜| 男女作爱免费网站| 亚洲黄色片在线观看| 久久久久免费看成人影片| 亚洲sm另类一区二区三区| 亚洲av不卡一区二区三区| 免费人成视频在线观看网站| 日韩欧美亚洲国产精品字幕久久久| 亚洲AV无码国产精品麻豆天美| 国产真人无遮挡作爱免费视频| 91老湿机福利免费体验| 免费无遮挡无遮羞在线看| 中文字幕 亚洲 有码 在线 | 国产啪精品视频网免费| 三年在线观看免费观看完整版中文| 亚洲日本VA中文字幕久久道具| 亚洲成AV人片在线观看无| www国产亚洲精品久久久日本| 无码人妻一区二区三区免费| 免费国产成人午夜在线观看| 十八禁的黄污污免费网站|