最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2020年06月22日 10:30:14   作者:CurtainMy  
這篇文章主要介紹了Spring boot AOP通過XML配置文件聲明,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

通過 XML 配置文件聲明

在前兩篇博文和示例中,我們已經展示了如何通過注解配置去聲明切面,下面我們看看如何在 XML 文件中聲明切面。下面先列出 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 定義一個切面
aop:aspectj-autoproxy 啟用@AspectJ注解驅動的切面
aop:before 定義一個AOP前置通知
aop:config 頂層的AOP配置元素。大多數的aop:*元素必須包含在aop:config元素內
aop:declare-parents 以透明的方式為被通知的對象引入額外的接口
aop:pointcut 定義一個切點

XML 配置文件中切點指示器

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

XML 文件配置 AOP 

新建OrderXmlAop.java:

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

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

<?xml version="1.0" encoding="UTF-8"?>
<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">
   <!-- 前置通知: 在目標方法調用前執(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é)點上的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);
 }
}

運行結果:

聲明環(huán)繞通知

修改OrderXmlAop.java:

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

aoporder.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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"/>
   <!-- 前置通知: 在目標方法調用前執(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>

運行結果:

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

XML 文件配置聲明切點 

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

<?xml version="1.0" encoding="UTF-8"?>
<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:pointcut id="point" expression="execution(public * com.example.demo.service.TakeawayService.*(..)))"/>
  <!-- 切面 -->
  <aop:aspect ref="OrderXmlAop">
   <!-- 環(huán)繞通知 -->
   <aop:around pointcut-ref="point" method="doAround"/>
   <!-- 前置通知: 在目標方法調用前執(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í)行結果:

XML文件配置為通知傳遞參數

修改OrderXmlAop.java

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

修改aoporder.xml

<?xml version="1.0" encoding="UTF-8"?>
<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: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>

總結

本文主要通過XML配置文件使用 Spring AOP進行編程,和上一篇的注解方式兩者聯系起來對于剛入門的應該多多少少還是有點幫助的吧,針對于aop 通過三篇博客簡單的描述,相信大家對此都有點印象了,記錄了 AOP 的編程思想,然后介紹了 Spring 中 AOP 的相關概念,以及通過注解方式和XML配置文件兩種方式使用 Spring AOP進行編程。所以對aop的博文就簡單到這兒了,有人要問了,aop里面的代理啊還有各種各樣的,如果真要吧aop重頭到尾來一遍的話,這個系列可以單獨提出來一個專欄了,所以后面的博文應該都是圍繞連接數據庫,記錄日志,接入swagger文檔等功能相繼展開了。在此過程中,我有錯誤使用的地方,或者表達有問題,還請您及時告知,本人會在第一時間予以改正。最后在祝大家周末愉快,C Y L L

相關文章

  • Java超詳細講解接口的實現與用法

    Java超詳細講解接口的實現與用法

    Java接口是一系列方法的聲明,是一些方法特征的集合,一個接口只有方法的特征沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為
    2022-04-04
  • Lambda表達式和Java集合框架

    Lambda表達式和Java集合框架

    本文主要介紹了Lambda表達式和Java集合框架的相關知識,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • Java快速入門掌握類與對象及變量的使用

    Java快速入門掌握類與對象及變量的使用

    類和對象是兩種以計算機為載體的計算機語言的合稱。對象是對客觀事物的抽象,類是對對象的抽象。類是一種抽象的數據類型;變量就是可以變化的量,存儲在內存中—個可以擁有在某個范圍內的可變存儲區(qū)域
    2022-04-04
  • Java并發(fā)編程之synchronized底層實現原理分析

    Java并發(fā)編程之synchronized底層實現原理分析

    這篇文章主要介紹了Java并發(fā)編程之synchronized底層實現原理,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Java File類的詳解及簡單實例

    Java File類的詳解及簡單實例

    這篇文章主要介紹了Java File類的詳解及簡單實例的相關資料,希望通過本文大家能夠掌握這部分內容,需要的朋友可以參考下
    2017-09-09
  • SpringBoot整合JPA詳細代碼實例

    SpringBoot整合JPA詳細代碼實例

    這篇文章主要給大家介紹了關于SpringBoot整合JPA的相關資料,JPA(Java Persistence API)是Sun官方提出的Java持久化規(guī)范,它為Java開發(fā)人員提供了一種對象/關聯映射工具來管理Java應用中的關系數據,需要的朋友可以參考下
    2024-05-05
  • 使用spring?security?BCryptPasswordEncoder接入系統

    使用spring?security?BCryptPasswordEncoder接入系統

    這篇文章主要介紹了使用spring?security?BCryptPasswordEncoder接入系統方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 10種java數組合并的常用方法總結

    10種java數組合并的常用方法總結

    在Java中,合并(或連接)數組是常見的任務,這篇文章主要為大家整理了10個java中常用的數組合并方法,文中的示例代碼簡潔易懂,需要的小伙伴可以參考下
    2023-12-12
  • 詳解Java中static關鍵字和內部類的使用

    詳解Java中static關鍵字和內部類的使用

    這篇文章主要為大家詳細介紹了Java中static關鍵字和內部類的使用,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-08-08
  • springcloud config配置讀取優(yōu)先級過程詳解

    springcloud config配置讀取優(yōu)先級過程詳解

    這篇文章主要介紹了springcloud config配置讀取優(yōu)先級過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09

最新評論

黎平县| 黔西县| 泰顺县| 南宫市| 芜湖县| 宁明县| 沧州市| 西贡区| 绥滨县| 玉林市| 双峰县| 施甸县| 乳山市| 江口县| 深圳市| 泰和县| 姜堰市| 榆社县| 普宁市| 永州市| 新巴尔虎左旗| 师宗县| 松潘县| 绩溪县| 北京市| 阿合奇县| 偏关县| 资溪县| 孟津县| 洛浦县| 遵义县| 和平区| 雷波县| 融水| 长垣县| 惠水县| SHOW| 灯塔市| 昭通市| 双柏县| 海城市|