真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringAOP的示例分析-創(chuàng)新互聯(lián)

這篇文章主要為大家展示了“Spring AOP的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Spring AOP的示例分析”這篇文章吧。

創(chuàng)新互聯(lián)長(zhǎng)期為近1000家客戶(hù)提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為霞浦企業(yè)提供專(zhuān)業(yè)的做網(wǎng)站、成都網(wǎng)站制作,霞浦網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

Spring中對(duì)AOP的支持

Spring中AOP代理由Spring的IoC容器負(fù)責(zé)生成、管理,其依賴(lài)關(guān)系也由IoC容器負(fù)責(zé)管理。因此,AOP代理可以直接使用容器中的其他Bean實(shí)例作為目標(biāo),這種關(guān)系可由IoC容器的依賴(lài)注入提供。Spring默認(rèn)使用Java動(dòng)態(tài)代理來(lái)創(chuàng)建AOP代理,這樣就可以為任何接口實(shí)例創(chuàng)建代理了。當(dāng)需要代理的類(lèi)不是代理接口的時(shí)候,Spring自動(dòng)會(huì)切換為使用CGLIB代理,也可強(qiáng)制使用CGLIB。

本例子的邏輯如下:有一個(gè)Car類(lèi)(業(yè)務(wù)類(lèi)),在Car類(lèi)中的go方法運(yùn)行之前和之后,都會(huì)有相應(yīng)的日志記錄,但Car類(lèi)本身并不知道日志的任何邏輯。

創(chuàng)建Maven項(xiàng)目并添加依賴(lài)

首先,新建一個(gè)Maven項(xiàng)目,使用 maven‐archetype‐quickstart模板,然后打開(kāi)pom.xml文件,加入Spring AOP運(yùn)行需要的依賴(lài)包


  org.springframework
  spring-core
  4.0.5.RELEASE


  org.springframework
  spring-beans
  4.0.5.RELEASE


  org.springframework
  spring-context
  4.0.5.RELEASE


  org.springframework
  spring-aop
  4.0.5.RELEASE


  org.aspectj
  aspectjweaver
  1.8.1

編寫(xiě)業(yè)務(wù)代碼

新增一個(gè)業(yè)務(wù)類(lèi)Car,包含一個(gè)go()方法

package com.wowo.spring_aop_demo1;
public class Car {
  public void go(){
    System.out.println("go go go!");
  }
}

編寫(xiě)切面類(lèi)

日志類(lèi)會(huì)記錄下系統(tǒng)的運(yùn)行情況,但日志的邏輯不會(huì)在業(yè)務(wù)類(lèi)中寫(xiě)的到處都是,而是作為一個(gè)切面類(lèi)存在。

package com.wowo.spring_aop_demo1;
public class CarLogger {
  public void beforeRun(){
    System.out.println("car is going to run");
  }
  public void afterRun(){
    System.out.println("car is running");
  }
}

該切面類(lèi)包含兩個(gè)方法,他們分別是前置通知和后置通知。

通過(guò)bean來(lái)配置關(guān)聯(lián)

新增一個(gè)配置文件,本例命名為bean.xml,在配置文件中來(lái)關(guān)聯(lián)切面與通知



  
  
  
    
      

      
      
    
  

注意:這個(gè)配置文件中,aop的命名空間,以及xsi:schemaLocation中包含的幾個(gè)地址都是必須的。
execution(* com.wowo.spring_aop_demo1.Car.go(..))是一個(gè)AspectJ切點(diǎn)表達(dá)式,execution表示在執(zhí)行時(shí)觸發(fā),后面的*表示任意類(lèi)型的返回值,com.wowo.spring_aop_demo1.Car指的是切點(diǎn)所在的類(lèi),go(..)是方法名,..表示任意參數(shù)。

Spring切面可以應(yīng)用5種類(lèi)型的通知:

·Before——在方法被調(diào)用之前調(diào)用通知
·After——在方法完成之后調(diào)用通知,無(wú)論方法是否執(zhí)行成功
·After-returning——在方法成功執(zhí)行之后調(diào)用通知
·After-throwing——在方法拋出異常后調(diào)用通知
·Around——通知包裹了被通知的方法,在被通知的方法調(diào)用之前和調(diào)用之后都執(zhí)行自定義的行為

運(yùn)行業(yè)務(wù)代碼

下面創(chuàng)建一個(gè)包含main()方法的類(lèi),來(lái)運(yùn)行業(yè)務(wù)代碼

package com.wowo.spring_aop_demo1;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App 
{
  public static void main( String[] args )
  {
    ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
    Car car=(Car) context.getBean("car");
    car.go();
  }
}

在上面的代碼中,由Spring創(chuàng)建了一個(gè)car對(duì)象。Spring在創(chuàng)建該對(duì)象時(shí),發(fā)現(xiàn)它的一個(gè)方法被配置成了切點(diǎn)(pointcut),所以,在實(shí)例化該對(duì)象時(shí),會(huì)創(chuàng)建一個(gè)代理對(duì)象,當(dāng)切點(diǎn)方法go()執(zhí)行時(shí),會(huì)被Spring創(chuàng)建的代理對(duì)象所攔截,運(yùn)行g(shù)o方法之前,會(huì)調(diào)用所對(duì)應(yīng)的切面類(lèi)CarLogger的前置方法beforeRun(),然后調(diào)用Car.go()方法,再然后就調(diào)用切面類(lèi)CarLogger的后置方法afterRun()。

注意:必須使用Spring創(chuàng)建包含切點(diǎn)的對(duì)象,如果自己創(chuàng)建的話(huà),Spring是監(jiān)測(cè)不到的,它的運(yùn)行也不會(huì)被應(yīng)用任何通知。

項(xiàng)目輸出結(jié)果為

car is going to run
go go go!
car is running

使用環(huán)繞通知

如果想使用環(huán)繞通知,我們需要修改切面類(lèi)中的通知方法以及配置文件,業(yè)務(wù)類(lèi)無(wú)需做任何修改,因?yàn)樗麄兪峭耆怦畹?。首先修改切面?lèi)CarLogger

import org.aspectj.lang.ProceedingJoinPoint;
public class CarLogger {

  public void aroundRun(ProceedingJoinPoint joinpoint){
    System.out.println("car is going to run");
    try {
      //調(diào)用被代理的對(duì)象的目標(biāo)方法,本例中指向Car.go()方法
      joinpoint.proceed();
    } catch (Throwable e) {
      e.printStackTrace();
    }
    System.out.println("car is running");
  }
}

環(huán)繞通知的方法,需要接受ProceedingJoinPoint類(lèi)型的參數(shù),其proceed()方法將會(huì)調(diào)用被代理對(duì)象的目標(biāo)方法,所以,正常情況下,這個(gè)方法一定要調(diào)用。我們也可以通過(guò)不調(diào)用該方法來(lái)組織被代理對(duì)象的運(yùn)行。

接下來(lái)將配置文件的aop:config部分修改為如下所示


    
      
      
    
  

注意:環(huán)繞通知不能和前置/后置通知同時(shí)存在。運(yùn)行代碼后,輸出結(jié)果不變。

以上是“Spring AOP的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


分享文章:SpringAOP的示例分析-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)網(wǎng)址:http://weahome.cn/article/cedcjd.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部