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

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

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

    e代劍客——溫柔一刀

    生活就像海洋,只有意志堅強的人,才能到達彼岸

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

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

    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需要實現,它定義了advice的實現。before方法共用三個參數,它們提供了相當豐富的信息。參數Method m是advice開始后執行的方法。方法名稱可以用作判斷是否執行代碼的條件。Object[] args是傳給被調用的public方法的參數數組。當需要記日志時,參數args和被執行方法的名稱,都是非常有用的信息。你也可以改變傳給m的參數,但要小心使用這個功能;編寫最初主程序的程序員并不知道主程序可能會和傳入參數的發生沖突。Object target是執行方法m對象的引用。

    在下面的BeanImpl類中,每個public方法調用前,都會執行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實現了下面的接口Bean:
    package?com.company.springaop.test;?

    public?interface?Bean?{?
    ??
    public?void?theMethod();?
    }


    雖然不是必須使用接口,但面向接口而不是面向實現編程是良好的編程實踐,Spring也鼓勵這樣做。

    pointcut和advice通過配置文件來實現,因此,接下來你只需編寫主方法的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();?
    ??}
    ?
    }


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

    僅僅用配置文件便可把程序的每一部分組裝起來。
    <?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定義的次序并不重要。我們現在有了一個advice,一個包含了正則表達式pointcut的advisor,一個主程序類和一個配置好的接口,通過工廠ctx,這個接口返回自己本身實現的一個引用。

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

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

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


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


    Spring工具

    雖然你可以手工修改Ant構建腳本,但使用SpringUI(譯注:SpringUI現在是Spring framework的一部分,并改名為spring-ide),使用Spring AOP變得很簡單,只要點點鼠標即可。你可以把SpringUI安裝成Eclipse的一個plug-in。然后,你只需在你的project上右擊鼠標,并選擇“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!


    優點和缺點

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

    posted on 2006-07-13 23:01 溫柔一刀 閱讀(285) 評論(0)  編輯  收藏 所屬分類: 開源框架
    聯系偶 zhupanjava@gmail.com 溫柔一刀
    主站蜘蛛池模板: 亚洲AV永久无码精品一福利| 亚洲精品国产肉丝袜久久| 久久亚洲精品国产精品婷婷| 无码精品A∨在线观看免费| 亚洲视频在线观看网址| 国产妇乱子伦视频免费| 亚洲国产成人久久三区| 四虎成人免费影院网址| 国产亚洲综合视频| 亚洲区日韩区无码区| 国内永久免费crm系统z在线 | 曰批全过程免费视频在线观看无码 | 一级毛片一级毛片免费毛片| 亚洲色精品vr一区二区三区| 少妇性饥渴无码A区免费| 亚洲精品日韩中文字幕久久久| 无遮免费网站在线入口| 亚洲6080yy久久无码产自国产| 亚洲av无码不卡私人影院| 男女一进一出抽搐免费视频 | 亚洲国产精品自产在线播放| 中文在线免费视频| 亚洲综合无码一区二区三区| 久久精品女人天堂AV免费观看| 国产精品亚洲二区在线| 久久亚洲国产欧洲精品一| 美女内射毛片在线看免费人动物| 亚洲欧美一区二区三区日产| 亚洲一区二区视频在线观看| 99re在线这里只有精品免费 | 精品成人免费自拍视频| 亚洲av片不卡无码久久| 免费中文字幕在线观看| 久久国产精品一区免费下载| 亚洲av无码日韩av无码网站冲| 亚洲日本va中文字幕久久| 国产乱码免费卡1卡二卡3卡| 人成午夜免费大片在线观看| 亚洲欧洲高清有无| 超清首页国产亚洲丝袜| 久久久久国色AV免费看图片|