您好,登錄后才能下訂單哦!
不懂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 :
<?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"> <!-- 前置通知: 在目標(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é)果:
聲明環(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 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é)果:
結(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 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é)果:
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 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í)!
免責(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)容。