溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring boot AOP通過XML配置文件聲明切面的方法

發(fā)布時(shí)間:2020-06-23 09:21:05 來源:億速云 閱讀:478 作者:清晨 欄目:開發(fā)技術(shù)

不懂Spring boot AOP通過XML配置文件聲明切面的方法?其實(shí)想解決這個(gè)問題也不難,下面讓小編帶著大家一起學(xué)習(xí)怎么去解決,希望大家閱讀完這篇文章后大所收獲。

下面先列出 XML 中聲明 AOP 的常用元素:

AOP配置元素用途
aop:advisor定義AOP通知器
aop:after定義AOP后置通知(不管被通知的方法是否執(zhí)行成功)
aop:after-returning定義AOP返回通知
aop:after-throwing定義AOP異常通知
aop:around定義AOP環(huán)繞通知
aop:aspect定義一個(gè)切面
aop:aspectj-autoproxy啟用@AspectJ注解驅(qū)動(dòng)的切面
aop:before定義一個(gè)AOP前置通知
aop:config頂層的AOP配置元素。大多數(shù)的aop:*元素必須包含在aop:config元素內(nèi)
aop:declare-parents以透明的方式為被通知的對(duì)象引入額外的接口
aop:pointcut定義一個(gè)切點(diǎn)

XML 配置文件中切點(diǎn)指示器

在XML配置文件中,切點(diǎn)指示器表達(dá)式與通過注解配置的寫法基本一致,區(qū)別前面有提到,即XML文件中需要使用 “and”、“or”、“not”來表示 “且”、“或”、“非”的關(guān)系。

XML 文件配置 AOP 

新建OrderXmlAop.java:

package com.example.demo.aop;
 
public class OrderXmlAop {
 
  /**
   * @description 在連接點(diǎn)執(zhí)行之前執(zhí)行的通知
   */
  public void doBefore(){
    System.out.println("阿里阿塞喲!");
  }
 
  /**
   * @description 在連接點(diǎn)執(zhí)行之后執(zhí)行的通知(返回通知和異常通知的異常)
   */
  public void doAfter(){
    System.out.println("after!");
  }
 
 
  /**
   * @description 在連接點(diǎn)執(zhí)行之后執(zhí)行的通知(返回通知)
   */
   public void doAfterReturning(){
 
     System.out.println("返回通知:AfterReturning");
   }
 
  /**
   * @description 在連接點(diǎn)執(zhí)行之后執(zhí)行的通知(異常通知)
   */
  public void doAfterThrowing(){
   System.out.println("異常通知:AfterThrowing");
   }
}

在 Resource 目錄下新建一個(gè)配置文件 aoporder.xml :

<&#63;xml version="1.0" encoding="UTF-8"&#63;>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
 
  <bean id="wmzService" class="com.example.demo.service.impl.WMZServiceImpl"></bean>
  <bean id="zsService" class="com.example.demo.service.impl.ZSServiceImpl"></bean>
  <!-- 切面類 -->
  <bean id="OrderXmlAop" class="com.example.demo.aop.OrderXmlAop"></bean>
 
  <!-- Aop配置 -->
  <aop:config proxy-target-class="true">
 
    <!-- 切面 -->
    <aop:aspect ref="OrderXmlAop">
      <!-- 前置通知: 在目標(biāo)方法調(diào)用前執(zhí)行 -->
      <aop:before pointcut="execution(public * com.example.demo.service.TakeawayService.*(..)))" method="doBefore"/>
      <!-- 后置通知: -->
      <aop:after pointcut="execution(public * com.example.demo.service.TakeawayService.*(..)))" method="doAfter"/>
      <!-- 返回后通知 -->
      <aop:after-returning pointcut="execution(public * com.example.demo.service.TakeawayService.*(..)))" method="doAfterReturning"/>
      <!-- 異常通知 -->
      <aop:after-throwing pointcut="execution(public * com.example.demo.service.TakeawayService.*(..)))" method="doAfterThrowing"/>
    </aop:aspect>
  </aop:config>
</beans>

新建 TakeXmlController.java

package com.example.demo.controller;
 
import com.example.demo.entity.Response;
import com.example.demo.entity.ResponseResult;
import jdk.internal.org.objectweb.asm.tree.analysis.Value;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.service.TakeawayService;
@RestController
@RequestMapping("/api")
 
public class TakeXmlController {
 
  ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("aoporder.xml");
  @RequestMapping("/orderxml")
  public ResponseResult Ordexml()
  {
    /**
    ** 注意 此處的getBean(name)中的name 必須要和aoporder.xml 配置的bean節(jié)點(diǎn)上的id 保持一致
     * 如: <bean id="wmzService" class="com.example.demo.service.impl.WMZServiceImpl"></bean>
     * TakeawayService wmzService=(TakeawayService)context.getBean("wmzService");
     */
    TakeawayService wmzService=(TakeawayService)context.getBean("wmzService");
    String wmz= wmzService.Order(12);
    System.out.println(wmz);
    TakeawayService zsService=(TakeawayService)context.getBean("zsService");
    String zs=zsService.Order(4396);
    System.out.println(zs);
    return Response.makeOKRsp(wmz+";"+zs);
  }
}

運(yùn)行結(jié)果:

Spring boot AOP通過XML配置文件聲明切面的方法

聲明環(huán)繞通知

修改OrderXmlAop.java:

package com.example.demo.aop;
 
import org.aspectj.lang.ProceedingJoinPoint;
 
public class OrderXmlAop {
 
  /**
   * @description 在連接點(diǎn)執(zhí)行之前執(zhí)行的通知
   */
  public void doBefore(){
    System.out.println("阿里阿塞喲!");
  }
 
  /**
   * @description 在連接點(diǎn)執(zhí)行之后執(zhí)行的通知(返回通知和異常通知的異常)
   */
  public void doAfter(){
    System.out.println("after!");
  }
 
 
  /**
   * @description 在連接點(diǎn)執(zhí)行之后執(zhí)行的通知(返回通知)
   */
   public void doAfterReturning(){
 
     System.out.println("返回通知:AfterReturning");
   }
 
  /**
   * @description 在連接點(diǎn)執(zhí)行之后執(zhí)行的通知(異常通知)
   */
  public void doAfterThrowing(){
   System.out.println("異常通知:AfterThrowing");
   }
 
  /**
   * @description 在連接點(diǎn)執(zhí)行之后執(zhí)行的通知(異常通知)
   */
  public void doAround(ProceedingJoinPoint pj) {
    try {
      System.out.println("Around 調(diào)用方法前 ");
      pj.proceed();
      System.out.println("Around 調(diào)用方法后");
    } catch (Throwable throwable) {
      throwable.printStackTrace();
    }
  }
}

aoporder.xml:

<&#63;xml version="1.0" encoding="UTF-8"&#63;>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
 
  <bean id="wmzService" class="com.example.demo.service.impl.WMZServiceImpl"></bean>
  <bean id="zsService" class="com.example.demo.service.impl.ZSServiceImpl"></bean>
  <!-- 切面類 -->
  <bean id="OrderXmlAop" class="com.example.demo.aop.OrderXmlAop"></bean>
 
  <!-- Aop配置 -->
  <aop:config proxy-target-class="true">
 
    <!-- 切面 -->
    <aop:aspect ref="OrderXmlAop">
      <!-- 環(huán)繞通知 -->
      <aop:around pointcut="execution(public * com.example.demo.service.TakeawayService.*(..)))" method="doAround"/>
      <!-- 前置通知: 在目標(biāo)方法調(diào)用前執(zhí)行 -->
      <aop:before pointcut="execution(public * com.example.demo.service.TakeawayService.*(..)))" method="doBefore"/>
      <!-- 后置通知: -->
      <aop:after pointcut="execution(public * com.example.demo.service.TakeawayService.*(..)))" method="doAfter"/>
      <!-- 返回后通知 -->
      <aop:after-returning pointcut="execution(public * com.example.demo.service.TakeawayService.*(..)))" method="doAfterReturning"/>
      <!-- 異常通知 -->
      <aop:after-throwing pointcut="execution(public * com.example.demo.service.TakeawayService.*(..)))" method="doAfterThrowing"/>
    </aop:aspect>
  </aop:config>
</beans>

運(yùn)行結(jié)果:

Spring boot AOP通過XML配置文件聲明切面的方法

結(jié)果和我們預(yù)期的一致,環(huán)繞通知通過xml配置成功。

XML 文件配置聲明切點(diǎn) 

在上面的例子中,我們發(fā)現(xiàn)有切點(diǎn)表達(dá)式多次重復(fù)出現(xiàn),那么可不可以和aspectj配置一樣,單獨(dú)聲明切點(diǎn),后面復(fù)用,答案是當(dāng)然可以。如下修改aoporder.xml:

<&#63;xml version="1.0" encoding="UTF-8"&#63;>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
 
  <bean id="wmzService" class="com.example.demo.service.impl.WMZServiceImpl"></bean>
  <bean id="zsService" class="com.example.demo.service.impl.ZSServiceImpl"></bean>
  <!-- 切面類 -->
  <bean id="OrderXmlAop" class="com.example.demo.aop.OrderXmlAop"></bean>
 
  <!-- Aop配置 -->
  <aop:config proxy-target-class="true">
    <!-- 切點(diǎn) -->
    <aop:pointcut id="point" expression="execution(public * com.example.demo.service.TakeawayService.*(..)))"/>
    <!-- 切面 -->
    <aop:aspect ref="OrderXmlAop">
      <!-- 環(huán)繞通知 -->
      <aop:around pointcut-ref="point" method="doAround"/>
      <!-- 前置通知: 在目標(biāo)方法調(diào)用前執(zhí)行 -->
      <aop:before pointcut-ref="point" method="doBefore"/>
      <!-- 后置通知: -->
      <aop:after pointcut-ref="point" method="doAfter"/>
      <!-- 返回后通知 -->
      <aop:after-returning pointcut-ref="point" method="doAfterReturning"/>
      <!-- 異常通知 -->
      <aop:after-throwing pointcut-ref="point" method="doAfterThrowing"/>
    </aop:aspect>
  </aop:config>
</beans>

修改后執(zhí)行結(jié)果:

Spring boot AOP通過XML配置文件聲明切面的方法

XML文件配置為通知傳遞參數(shù)

修改OrderXmlAop.java

public String doAround(ProceedingJoinPoint pj,double price) {
    try {
      System.out.println("Around 調(diào)用方法前 ");
      pj.proceed();
      if(price>=4396)
      {
        System.out.println("zs下單超過了4399,贈(zèng)送一份鮮果飲匯源牌飲料");
        return "爆漿牛丸和飲料";
      }
      System.out.println("Around 調(diào)用方法后");
    } catch (Throwable throwable) {
      throwable.printStackTrace();
    }
    return "爆漿牛丸";
  }

修改aoporder.xml

<&#63;xml version="1.0" encoding="UTF-8"&#63;>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
 
  <bean id="wmzService" class="com.example.demo.service.impl.WMZServiceImpl"></bean>
  <bean id="zsService" class="com.example.demo.service.impl.ZSServiceImpl"></bean>
  <!-- 切面類 -->
  <bean id="OrderXmlAop" class="com.example.demo.aop.OrderXmlAop"></bean>
 
  <!-- Aop配置 -->
  <aop:config proxy-target-class="true">
    <!-- 切點(diǎn) -->
    <aop:pointcut id="point" expression="execution(com.example.demo.service.TakeawayService.Order(double)) and args(price) and bean(zsService)"/>
    <!-- 切面 -->
    <aop:aspect ref="OrderXmlAop">
      <!-- 環(huán)繞通知 -->
      <aop:around pointcut-ref="point" method="doAround"/>
    </aop:aspect>
  </aop:config>
</beans>

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享Spring boot AOP通過XML配置文件聲明切面的方法內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問題就找億速云,詳細(xì)的解決方法等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI