国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Spring Framework中的面向方面編程(AOP),第一部分

2019-11-18 16:12:52
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  作為這個(gè)介紹SPRing框架中的面向方面編程(aspect-Oriented Programming,AOP)的系列的第一部分,本文介紹了使您可以使用Spring中的面向方面特性進(jìn)行快速開(kāi)發(fā)的基礎(chǔ)知識(shí)。使用跟蹤和記錄方面(面向方面領(lǐng)域的HelloWorld)作為例子,本文展示了如何使用Spring框架所獨(dú)有的特性來(lái)聲明切入點(diǎn)和通知以便應(yīng)用方面。本系列的第二部分將更深入地介紹如何運(yùn)用Spring中的所有通知類(lèi)型和切入點(diǎn)來(lái)實(shí)現(xiàn)更實(shí)用的方面和面向方面設(shè)計(jì)模式。對(duì)于AOP的更一般性的介紹,請(qǐng)查看ONjava站點(diǎn)上Graham O'Regan的文章,“IntrodUCtion to Aspect-Oriented Programming”。

  本文的目的不是要介紹構(gòu)成模塊化J2EE系統(tǒng)——即Spring框架——的所有重要元素,我們將只把注意力放在Spring所提供的AOP功能上。由于Spring的模塊化設(shè)計(jì)方法,我們可以只使用該框架的AOP元素,而無(wú)需對(duì)構(gòu)成Spring框架的其他模塊做太多考慮。

在AOP方面,Spring提供了什么?
  “它的目標(biāo)不是提供最完善的AOP實(shí)現(xiàn)(雖然Spring AOP非常強(qiáng)大);而是要提供AOP實(shí)現(xiàn)與Spring IoC的緊密集成,以便幫助解決企業(yè)應(yīng)用中的常見(jiàn)問(wèn)題。”
Spring Framework參考文檔

  為了實(shí)現(xiàn)這個(gè)目標(biāo),Spring框架目前支持一組AOP概念,從切入點(diǎn)到通知。本文將展示如何使用Spring框架中所實(shí)現(xiàn)的如下AOP概念:

  • 通知(Advice):如何將before通知、afterReturning通知和afterThrowing通知聲明為bean。
  • 切入點(diǎn)(Pointcut):如何聲明靜態(tài)切入點(diǎn)邏輯以將xml Spring Bean Configuration文件中的所有內(nèi)容聯(lián)系在一起。
  • Advisor關(guān)聯(lián)切入點(diǎn)定義與通知bean的方式。

設(shè)置場(chǎng)景:一個(gè)簡(jiǎn)單的例子應(yīng)用程序
  “一般而言,Spring并不是預(yù)描述的。雖然使用好的實(shí)踐非常容易,但是它避免強(qiáng)制推行一種特定的方法。”
Spring Framework參考文檔

  要試用Spring框架的AOP功能,首先我們要?jiǎng)?chuàng)建一個(gè)簡(jiǎn)單的Java應(yīng)用程序。IbusinessLogic接口和BusinessLogic類(lèi)為Spring框架中的bean提供了簡(jiǎn)易構(gòu)件塊。雖然該接口對(duì)于我們的簡(jiǎn)單應(yīng)用程序邏輯來(lái)說(shuō)不是必需的,但是它是Spring框架所推薦的良好實(shí)踐。

public interface IBusinessLogic{    public void foo();}public class BusinessLogic     implements IBusinessLogic{    public void foo()     {        System.out.println(        "Inside BusinessLogic.foo()");    }}

  可以編寫(xiě)Mainapplication類(lèi),借此練習(xí)BusinessLogic bean的公有方法。

import org.springframework.context.ApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;public class MainApplication{    public static void main(String [] args)    {        // Read the configuration file        ApplicationContext ctx =           new FileSystemXmlApplicationContext(            "springconfig.xml");        //Instantiate an object        IBusinessLogic testObject =           (IBusinessLogic) ctx.getBean("businesslogicbean");        // Execute the public         // method of the bean        testObject.foo();    }}

  在BusinessLogic類(lèi)及其關(guān)聯(lián)接口中沒(méi)有什么需要注意的。但是,MainApplication類(lèi)初始化BusinessLogic對(duì)象的方式很有意思。通過(guò)使用ctx.getBean("businesslogicbean")調(diào)用,MainApplication將加載和管理BusinessLogic類(lèi)的bean實(shí)例的任務(wù)轉(zhuǎn)交給了Spring框架。

  允許Spring控制BusinessLogic bean的初始化,這使得Spring運(yùn)行時(shí)有機(jī)會(huì)在bean被返回給應(yīng)用程序之前執(zhí)行J2EE系統(tǒng)所需的所有與bean相關(guān)的管理任務(wù)。然后Spring運(yùn)行時(shí)配置可以決定對(duì)bean應(yīng)用哪些任務(wù)和模塊。該配置信息由一個(gè)XML文件提供,類(lèi)似于下面所示的:

                     IBusinessLogic                                    


  該配置文件,即springconfig.xml,指定要加載一個(gè)接口與IbusinessLogic相匹配的bean。該bean隨后被關(guān)聯(lián)到BusinessLogic實(shí)現(xiàn)類(lèi)。看起來(lái)好像是費(fèi)了很大力氣只為了加載一個(gè)簡(jiǎn)單的bean并調(diào)用一個(gè)方法,但是您要知道,這個(gè)配置文件只是使Spring框架可以透明地對(duì)應(yīng)用程序應(yīng)用其組件的眾多特性的一個(gè)體現(xiàn)。

  圖1顯示了基本的順序圖:MainApplication原樣執(zhí)行,沒(méi)有應(yīng)用方面。

Spring Framework中的面向方面編程(AOP),第一部分(圖一)
圖1.沒(méi)有對(duì)BusinessLogic bean應(yīng)用方面時(shí)的順序圖

  請(qǐng)查看本文末尾處的參考資料,獲取這個(gè)簡(jiǎn)單Spring應(yīng)用程序的源代碼。

應(yīng)用方法跟蹤(Method Tracing)方面
  可能最基本的方面就是方法跟蹤方面了。這可能是您找得到的最簡(jiǎn)單的方面了,因此它是研究新的AOP實(shí)現(xiàn)的一個(gè)很好的起點(diǎn)。

  方法跟蹤方面在一個(gè)目標(biāo)應(yīng)用程序內(nèi)捕獲對(duì)所跟蹤的方法的調(diào)用以及方法的返回值,并以某種方式顯示這種信息。在AOP中,通知的before和after類(lèi)型用于捕獲這些類(lèi)型的聯(lián)結(jié)點(diǎn),因?yàn)檫@兩種通知可以在方法調(diào)用聯(lián)結(jié)點(diǎn)之前或之后觸發(fā)。使用Spring框架,方法跟蹤方面的before通知是在TracingBeforeAdvice類(lèi)中聲明的。

import java.lang.reflect.Method;import org.springframework.aop. MethodBeforeAdvice;public class TracingBeforeAdvice    implements MethodBeforeAdvice{    public void before(Method m,                      Object[] args,                      Object target)                      throws Throwable    {        System.out.println(          "Hello world! (by " +           this.getClass().getName() +           ")");    }}

  類(lèi)似地,after通知可以在TracingAfterAdvice類(lèi)中聲明。

import java.lang.reflect.Method;import org.springframework.aop.AfterReturningAdvice;public class TracingAfterAdvice    implements AfterReturningAdvice{    public void afterReturning(Object object,                              Method m,                              Object[] args,                              Object target)                              throws Throwable    {        System.out.println(          "Hello world! (by " +           this.getClass().getName() +           ")");    }}

  這兩個(gè)類(lèi)都通過(guò)實(shí)現(xiàn)Spring框架的適當(dāng)通知接口而表示了特定的通知。每種類(lèi)型的通知都指定實(shí)現(xiàn)before(..)或afterReturning(..)方法,以便使Spring運(yùn)行時(shí)可以告訴通知適當(dāng)?shù)穆?lián)結(jié)點(diǎn)會(huì)在何時(shí)出現(xiàn)。值得注意的是,TracingAfterAdvice實(shí)際上是從AfterReturningAdvice擴(kuò)展而來(lái)的,表示只有在聯(lián)結(jié)點(diǎn)在無(wú)異常的情況下獲得返回值時(shí)才運(yùn)行通知。

  為了將通知與應(yīng)用程序中的適當(dāng)聯(lián)結(jié)點(diǎn)關(guān)聯(lián)起來(lái),必須對(duì)springconfig.xml進(jìn)行一些修改。

                     IBusinessLogic                                                      theTracingBeforeAdvisor            theTracingAfterAdvisor                                                                     .*         	                                          .*            


  theTracingBeforeAdvisor和theTracingAfterAdvisor advisor被添加到前面所聲明的businesslogicbean。每個(gè)advisor都可能截獲所有bean所關(guān)聯(lián)到的聯(lián)結(jié)點(diǎn)。Advisor本身就是bean,而它唯一的作用就是將切入點(diǎn)定義與通知bean關(guān)聯(lián)起來(lái)。本例中的切入點(diǎn)定義是在靜態(tài)對(duì)象層次結(jié)構(gòu)中指定相關(guān)聯(lián)結(jié)點(diǎn)的正則表達(dá)式。

  因?yàn)楸纠惺褂昧薿rg.springframework.aop.support.RegexpMethodPointcutAdvisor切入點(diǎn)advisor,切入點(diǎn)邏輯是使用正則表達(dá)式指定的。正則表達(dá)式用于識(shí)別公有接口對(duì)IbusinessLogici接口的聯(lián)結(jié)點(diǎn)。下面是一些可以用來(lái)指定IBusinessLogic接口上的不同聯(lián)結(jié)點(diǎn)集合的正則表達(dá)式例子:

  • .*該表達(dá)式選擇advisor所關(guān)聯(lián)到的一個(gè)或多個(gè)bean上的所有聯(lián)結(jié)點(diǎn)。
  • ./IBusinessLogic/.foo該表達(dá)式只選擇IbusinessLogic接口上的foo()方法的聯(lián)結(jié)點(diǎn)。如果是advisor所關(guān)聯(lián)到的bean,則該表達(dá)式只選擇IBusinessLogic接口上的聯(lián)結(jié)點(diǎn)。

  springconfig.xml文件中最后的bean聲明指定實(shí)現(xiàn)通知bean的類(lèi)。

  既然已經(jīng)指定了跟蹤方面的正確配置,那么下一次執(zhí)行MainApplication時(shí),這些方面就會(huì)在初始化過(guò)程中被編織進(jìn)去,而B(niǎo)usinessLogic bean中的所有方法都將被跟蹤,如圖2所示。

  Spring Framework中的面向方面編程(AOP),第一部分(圖二)
圖2. 方法跟蹤方面應(yīng)用到BusinessLogic bean之后的順序圖(單擊圖像查看大圖)

  方法跟蹤方面和例子應(yīng)用程序的源代碼可在本文末尾的參考資料小節(jié)進(jìn)行下載。

方面的重用
  可以對(duì)方法跟蹤方面進(jìn)行擴(kuò)展,提供一個(gè)稍微復(fù)雜的記錄(Logging)方面。記錄方面提供了一個(gè)很不錯(cuò)的重用例子,因?yàn)橛涗浄矫嫠璧脑S多特性都已經(jīng)包含在方法跟蹤方面中了。

  在本例中,記錄方面擴(kuò)展了方法跟蹤方面,以便顯示附加的與(在應(yīng)用程序的執(zhí)行過(guò)程中)所引發(fā)的異常有關(guān)的信息。

  要完全使用記錄方面,需要對(duì)應(yīng)用程序做一些更改。BusinessLogicException異常類(lèi)提供了一個(gè)可以由IBusinessLogicInterface接口和BusinessLogic實(shí)現(xiàn)類(lèi)新增的void bar()方法引發(fā)的異常。

public class BusinessLogicException    extends Exception{}public interface IBusinessLogic{    public void foo();       public void bar()       throws BusinessLogicException;}public class BusinessLogic    implements IBusinessLogic{    public void foo()     {        System.out.println(          "Inside BusinessLogic.foo()");    }         public void bar()        throws BusinessLogicException    {        System.out.println(        "Inside BusinessLogic.bar()");          throw new BusinessLogicException();    }}

  MainApplication類(lèi)現(xiàn)在將對(duì)void bar()方法進(jìn)行一次額外的調(diào)用,并處理選中的、可能由該方法引發(fā)的異常。

import org.springframeworkcontext.ApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;public class MainApplication{    public static void main(String [] args)    {        // Read the configuration file        ApplicationContext ctx =          new FileSystemXmlApplicationContext(            "springconfig.xml");       //Instantiate an object       IBusinessLogic testObject =           (IBusinessLogic) ctx.getBean(            "businesslogicbean");       //Execute the public methods of the bean       testObject.foo();             try       {           testObject.bar();       }       catch(BusinessLogicException ble)       {           System.out.println(             "Caught BusinessLogicException");       }    }}

  來(lái)自方法跟蹤方面的TracingBeforeAdvice和TracingAfterAdvice通知可以整體重用。LoggingThrowsAdvice類(lèi)為新的異常記錄提供了通知。

import org.springframework.aop.ThrowsAdvice;import java.lang.reflect.Method;public class LoggingThrowsAdvice    implements ThrowsAdvice{    public void afterThrowing(Method method,                             Object[] args,                             Object target,                             Throwable subclass)    {       System.out.println(         "Logging that a " +          subclass +          "Exception was thrown.");    }}


  應(yīng)用記錄方面的最后一步是修改springconfig.xml配置文件,使其包含新添加的LoggingThrowsAdvice通知。

  圖3顯示了運(yùn)行MainApplication并使用Spring框架應(yīng)用了記錄方面的UML順序圖。

  Spring Framework中的面向方面編程(AOP),第一部分(圖三)
圖3. 記錄方面應(yīng)用到BusinessLogic bean之后的順序圖(單擊圖像查看大圖)

  此處的記錄方面清楚地說(shuō)明了如何重用現(xiàn)有方面以及如何在Spring框架中使用通知的throws形式。通過(guò)為before和after通知聲明新的通知來(lái)重寫(xiě)現(xiàn)有的方法跟蹤方面實(shí)現(xiàn),可以實(shí)現(xiàn)更復(fù)雜的記錄方面,記錄到更復(fù)雜的記錄框架,比如LOG4J。關(guān)于記錄方面和例子應(yīng)用程序的源代碼,請(qǐng)參見(jiàn)本文末尾的參考資料小節(jié)。

結(jié)束語(yǔ)
  本文展示了使用Spring框架中的基本AOP結(jié)構(gòu)所應(yīng)用的一些簡(jiǎn)單方面。在本系列的下一篇文章中,我們將介紹一些更實(shí)用的方面,探討方面的生命周期,使用Spring框架的around通知,并使用Spring來(lái)應(yīng)用AOP模式。

  參考資料

  • 本文的源代碼
  • Spring Java/J2EE Framework
  • Spring AOP Framework
  • "Introduction to Aspect-Oriented Programming"

  原文出處:An Introduction to Aspect-Oriented Programming with the Spring Framework, Part 1http://www.onjava.com/pub/a/onjava/2004/07/14/springaop.Html

Spring Framework中的面向方面編程(AOP),第一部分(圖四)
 作者簡(jiǎn)介Russell Miles是General Dynamics UK公司的一名軟件工程師,他負(fù)責(zé)Java和分布式系統(tǒng),但是他目前主要的興趣在面向方面領(lǐng)域,尤其是AspectJ。

(出處:http://www.survivalescaperooms.com)



發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 乐陵市| 上饶县| 江源县| 昭苏县| 肃宁县| 大兴区| 香格里拉县| 延庆县| 浦北县| 苗栗市| 普兰店市| 壶关县| 永靖县| 内江市| 铜鼓县| 牡丹江市| 天门市| 木里| 乌兰浩特市| 武乡县| 云安县| 营口市| 武汉市| 贵定县| 类乌齐县| 江源县| 白河县| 青冈县| 沂源县| 苍山县| 自贡市| 正阳县| 石嘴山市| 和硕县| 常州市| 荔波县| 德钦县| 祁阳县| 汉寿县| 泰州市| 麟游县|