日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:124日期:2023-05-09 17:24:15

通過 XML 配置文件聲明

在前兩篇博文和示例中,我們已經(jīng)展示了如何通過注解配置去聲明切面,下面我們看看如何在 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 定義一個(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”來(lái)表示 “且”、“或”、“非”的關(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 :

<?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 class='com.example.demo.service.impl.WMZServiceImpl'></bean> <bean class='com.example.demo.service.impl.ZSServiceImpl'></bean> <!-- 切面類 --> <bean 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 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:

<?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 class='com.example.demo.service.impl.WMZServiceImpl'></bean> <bean class='com.example.demo.service.impl.ZSServiceImpl'></bean> <!-- 切面類 --> <bean 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:

<?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 class='com.example.demo.service.impl.WMZServiceImpl'></bean> <bean class='com.example.demo.service.impl.ZSServiceImpl'></bean> <!-- 切面類 --> <bean class='com.example.demo.aop.OrderXmlAop'></bean> <!-- Aop配置 --> <aop:config proxy-target-class='true'> <!-- 切點(diǎn) --> <aop:pointcut 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

<?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 class='com.example.demo.service.impl.WMZServiceImpl'></bean> <bean class='com.example.demo.service.impl.ZSServiceImpl'></bean> <!-- 切面類 --> <bean class='com.example.demo.aop.OrderXmlAop'></bean> <!-- Aop配置 --> <aop:config proxy-target-class='true'> <!-- 切點(diǎn) --> <aop:pointcut 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>

總結(jié)

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

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
成人精品高清在线视频| 四季av一区二区凹凸精品| 久久久久久久久丰满| 欧美日韩视频免费观看| 精品国产乱码久久久| 久久亚洲资源中文字| 久久三级中文| 午夜欧美巨大性欧美巨大| 99久久婷婷| 美女国产一区| 日韩三级精品| 精品一区二区三区中文字幕视频| 日本久久综合| 黄色亚洲精品| 日本成人在线视频网站| 久久精品资源| 欧美亚洲在线日韩| 亚洲精品国产精品粉嫩| 麻豆久久久久久| 涩涩av在线| 99pao成人国产永久免费视频| 日韩和欧美一区二区三区| 国产一区二区三区久久| 蜜桃tv一区二区三区| 日韩一区二区三区在线看| 老司机精品视频网| 在线观看免费一区二区| 日本成人中文字幕| 久久夜夜操妹子| 男女精品网站| 精品三区视频| 视频在线观看一区二区三区| 欧美黑人巨大videos精品| 国产91一区| 日韩高清一区| 日韩国产综合| 亚洲精品激情| 久久久久91| 青青国产91久久久久久| 久久国产欧美| 国产精品日韩精品中文字幕| 欧洲激情综合| 精品一区不卡| 午夜精品影视国产一区在线麻豆| 97精品中文字幕| 日韩精品久久久久久久软件91| 国产美女高潮在线观看| 亚州精品视频| 99视频精品视频高清免费| 亚洲精品在线国产| 精品在线播放| 大香伊人久久精品一区二区| 日韩专区视频网站| 激情六月综合| 日本久久综合| 国产精品综合| 亚洲v天堂v手机在线| 91久久久精品国产| 国产成人精品亚洲日本在线观看| 国产精品一区二区精品视频观看| 国产亚洲一区在线| 久久久噜噜噜| 国产一区二区精品福利地址| 91p九色成人| 日韩一区二区久久| 视频小说一区二区| 波多视频一区| 久久精品国内一区二区三区| 日本成人中文字幕在线视频| 亚洲欧美日韩国产一区| 久久精品国产99久久| 久久久久久久欧美精品| 999国产精品永久免费视频app| 精品黄色一级片| 日韩精品一页| 热久久免费视频| 91精品国产91久久久久久黑人| 精品久久久亚洲| 国产精品毛片久久久| 日韩av网站免费在线| 亚洲精品无吗| 日韩欧美另类中文字幕| 亚州av日韩av| 亚洲精品一区二区在线播放∴| 欧美在线资源| 在线日韩视频| 99久久www免费| 久久要要av| 国产一区亚洲| 午夜日韩在线| 国产亚洲福利| 综合欧美亚洲| 日韩激情网站| 国产福利一区二区精品秒拍| 欧美国产先锋| 免费亚洲婷婷| 综合日韩av| 91精品在线观看国产| 樱桃成人精品视频在线播放| 美女少妇全过程你懂的久久| 日本久久成人网| 久久精品99久久无色码中文字幕| 久久人人88| 免费久久99精品国产自在现线| 亚洲精品一二| 久久国产麻豆精品| 国产在线不卡一区二区三区| 老牛影视精品| 99久久婷婷| 蜜臀va亚洲va欧美va天堂| 日本成人手机在线| 成人午夜网址| 91精品二区| 亚洲精品系列| 嫩草伊人久久精品少妇av杨幂 | 视频在线在亚洲| 日韩精品一区二区三区免费视频| 国产三级一区| 黑人精品一区| 视频在线观看91| 国产亚洲人成a在线v网站| 国产成人精品亚洲线观看| 国产日韩电影| 天堂成人国产精品一区| 欧美一级网址| 日韩伦理福利| 免费在线观看一区二区三区| 国产欧美成人| 福利在线一区| 在线午夜精品| 国产欧美一区| 免费亚洲婷婷| 亚洲深夜影院| 欧美成人日韩| 91午夜精品| 精品三级久久| 日韩亚洲精品在线观看| 欧美激情国产在线| 亚洲激情五月| 久久精品999| 欧美一区二区三区高清视频 | 国产欧美一区二区精品久久久 | 国产精品欧美在线观看| 新版的欧美在线视频| 蜜臀av在线播放一区二区三区 | 日本久久精品| 亚洲伊人影院| 91一区二区三区四区| 亚洲日本久久| 成人日韩在线| 国产精品夜夜夜| 香蕉精品久久| 久久99免费视频| 日韩影院在线观看| 精精国产xxxx视频在线野外 | 国产伦精品一区二区三区在线播放| 亚洲不卡系列| 久久国产三级精品| 91精品观看| 国产欧美一区二区三区精品酒店| 亚洲精品福利| 欧美美女一区| 国产精品久久久久久久免费观看| 亚州av日韩av| 制服诱惑一区二区| 国产一区二区三区四区| 日本va欧美va瓶| 亚洲女同中文字幕| 深夜福利视频一区二区| 国产日韩欧美一区二区三区在线观看| 国精品一区二区三区| 精品国产亚洲一区二区三区大结局| 亚洲精品无吗| 西西人体一区二区| 婷婷国产精品| 亚洲成a人片| 在线看片福利| 欧美激情福利| 国产亚洲人成a在线v网站| 蜜臀久久99精品久久久画质超高清| 日韩欧美一区二区三区在线视频 | 蜜臀久久精品| 欧美激情aⅴ一区二区三区| 天堂久久一区| 日韩精品一级二级| 国产中文一区| 日韩一区电影| 国产精品国产三级国产在线观看| 久久av日韩| 国产精品极品在线观看| 91精品国产自产观看在线| 国产午夜久久| 亚洲女同一区| 99在线精品免费视频九九视| 久久人人99| 日本精品影院| 国内亚洲精品| 欧美理论视频| 中日韩男男gay无套| 91九色精品国产一区二区|