日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Aop实例之xml配置

發布時間:2025/6/15 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Aop实例之xml配置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上篇博文《3幅圖讓你了解Spring AOP》中介紹了aop通知類型,AOP的配置方式有2種方式:xml配置和AspectJ注解方式。今天我們就來實踐一下xml配置方式。


? ? ? 我采用的jdk代理,所以首先將接口和實現類代碼附上

[java] view plain copy print?
  • package?com.tgb.aop;??
  • ??
  • public?interface?UserManager?{??
  • ??
  • ????public?String?findUserById(int?userId);??
  • }??
  • ??
  • ??
  • package?com.tgb.aop;??
  • ??
  • public?class?UserManagerImpl?implements?UserManager?{??
  • ??
  • ????public?String?findUserById(int?userId)?{??
  • ????????System.out.println("---------UserManagerImpl.findUserById()--------");??
  • ????????if?(userId?<=?0)?{??
  • ????????????throw?new?IllegalArgumentException("該用戶不存在!");???
  • ????????}??
  • ????????return?"張三";??
  • ????}??
  • }??

  • ? ? ? ?單獨寫一個Advice通知類進行測試。這個通知類可以換成安全性檢測、日志管理等等。
    [java] view plain copy print?
  • package?com.tgb.aop;??
  • ??
  • import?org.aspectj.lang.JoinPoint;??
  • import?org.aspectj.lang.ProceedingJoinPoint;??
  • ??
  • /**?
  • ?*?Advice通知類?
  • ?*?測試after,before,around,throwing,returning?Advice.?
  • ?*?@author?Admin?
  • ?*?
  • ?*/??
  • public?class?XMLAdvice?{??
  • ??
  • ????/**?
  • ?????*?在核心業務執行前執行,不能阻止核心業務的調用。?
  • ?????*?@param?joinPoint?
  • ?????*/??
  • ????private?void?doBefore(JoinPoint?joinPoint)?{??
  • ????????System.out.println("-----doBefore().invoke-----");??
  • ????????System.out.println("?此處意在執行核心業務邏輯前,做一些安全性的判斷等等");??
  • ????????System.out.println("?可通過joinPoint來獲取所需要的內容");??
  • ????????System.out.println("-----End?of?doBefore()------");??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?手動控制調用核心業務邏輯,以及調用前和調用后的處理,?
  • ?????*??
  • ?????*?注意:當核心業務拋異常后,立即退出,轉向After?Advice?
  • ?????*?執行完畢After?Advice,再轉到Throwing?Advice?
  • ?????*?@param?pjp?
  • ?????*?@return?
  • ?????*?@throws?Throwable?
  • ?????*/??
  • ????private?Object?doAround(ProceedingJoinPoint?pjp)?throws?Throwable?{??
  • ????????System.out.println("-----doAround().invoke-----");??
  • ????????System.out.println("?此處可以做類似于Before?Advice的事情");??
  • ??????????
  • ????????//調用核心邏輯??
  • ????????Object?retVal?=?pjp.proceed();??
  • ??????????
  • ????????System.out.println("?此處可以做類似于After?Advice的事情");??
  • ????????System.out.println("-----End?of?doAround()------");??
  • ????????return?retVal;??
  • ????}??
  • ??
  • ????/**?
  • ?????*?核心業務邏輯退出后(包括正常執行結束和異常退出),執行此Advice?
  • ?????*?@param?joinPoint?
  • ?????*/??
  • ????private?void?doAfter(JoinPoint?joinPoint)?{??
  • ????????System.out.println("-----doAfter().invoke-----");??
  • ????????System.out.println("?此處意在執行核心業務邏輯之后,做一些日志記錄操作等等");??
  • ????????System.out.println("?可通過joinPoint來獲取所需要的內容");??
  • ????????System.out.println("-----End?of?doAfter()------");??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?核心業務邏輯調用正常退出后,不管是否有返回值,正常退出后,均執行此Advice?
  • ?????*?@param?joinPoint?
  • ?????*/??
  • ????private?void?doReturn(JoinPoint?joinPoint)?{??
  • ????????System.out.println("-----doReturn().invoke-----");??
  • ????????System.out.println("?此處可以對返回值做進一步處理");??
  • ????????System.out.println("?可通過joinPoint來獲取所需要的內容");??
  • ????????System.out.println("-----End?of?doReturn()------");??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?核心業務邏輯調用異常退出后,執行此Advice,處理錯誤信息?
  • ?????*?@param?joinPoint?
  • ?????*?@param?ex?
  • ?????*/??
  • ????private?void?doThrowing(JoinPoint?joinPoint,Throwable?ex)?{??
  • ????????System.out.println("-----doThrowing().invoke-----");??
  • ????????System.out.println("?錯誤信息:"+ex.getMessage());??
  • ????????System.out.println("?此處意在執行核心業務邏輯出錯時,捕獲異常,并可做一些日志記錄操作等等");??
  • ????????System.out.println("?可通過joinPoint來獲取所需要的內容");??
  • ????????System.out.println("-----End?of?doThrowing()------");??
  • ????}??
  • }??

  • ? ? ? ?只有Advice還不行,還需要在application-config.xml中進行配置:

    [html] view plain copy print?
  • <?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"??
  • ?????????xmlns:tx="http://www.springframework.org/schema/tx"??
  • ?????????xsi:schemaLocation="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans-2.0.xsd??
  • ???????????http://www.springframework.org/schema/aop?http://www.springframework.org/schema/aop/spring-aop-2.0.xsd??
  • ???????????http://www.springframework.org/schema/tx?http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">??
  • ???????????????
  • ??????
  • ????<bean?id="userManager"?class="com.tgb.aop.UserManagerImpl"/>??
  • ??????
  • ????<!--<bean?id="aspcejHandler"?class="com.tgb.aop.AspceJAdvice"/>-->??
  • ????<bean?id="xmlHandler"?class="com.tgb.aop.XMLAdvice"?/>??
  • ????<aop:config>??
  • ????????<aop:aspect?id="aspect"?ref="xmlHandler">??
  • ????????????<aop:pointcut?id="pointUserMgr"?expression="execution(*?com.tgb.aop.*.find*(..))"/>??
  • ??????????????
  • ????????????<aop:before?method="doBefore"??pointcut-ref="pointUserMgr"/>??
  • ????????????<aop:after?method="doAfter"??pointcut-ref="pointUserMgr"/>??
  • ????????????<aop:around?method="doAround"??pointcut-ref="pointUserMgr"/>??
  • ????????????<aop:after-returning?method="doReturn"??pointcut-ref="pointUserMgr"/>??
  • ????????????<aop:after-throwing?method="doThrowing"?throwing="ex"?pointcut-ref="pointUserMgr"/>??
  • ??????????????
  • ????????</aop:aspect>??
  • ????</aop:config>??
  • </beans>??

  • ? ? ? ?編一個客戶端類進行測試一下:

    [java] view plain copy print?
  • package?com.tgb.aop;??
  • ??
  • import?org.springframework.beans.factory.BeanFactory;??
  • import?org.springframework.context.support.ClassPathXmlApplicationContext;??
  • ??
  • public?class?Client?{??
  • ??
  • ????public?static?void?main(String[]?args)?{??
  • ????????BeanFactory?factory?=?new?ClassPathXmlApplicationContext("applicationContext.xml");??
  • ????????UserManager?userManager?=?(UserManager)factory.getBean("userManager");??
  • ??????????
  • ????????//可以查找張三??
  • ????????userManager.findUserById(1);??
  • ??????????
  • ????????System.out.println("=====我==是==分==割==線=====");??
  • ??
  • ????????try?{??
  • ????????????//?查不到數據,會拋異常,異常會被AfterThrowingAdvice捕獲??
  • ????????????userManager.findUserById(0);??
  • ????????}?catch?(IllegalArgumentException?e)?{??
  • ????????}??
  • ????}??
  • }??

  • ? ? ? ?結果如圖:

    ? ? ? ?值得注意的是Around與Before和After的執行順序。3者的執行順序取決于在xml中的配置順序。圖中標記了3塊,分別對應Before,Around,After。其中②中包含有③。這是因為aop:after配置到了aop:around的前面,如果2者調換一下位置,這三塊就會分開獨立顯示。如果配置順序是aop:after ?-> aop:around ->aop:before,那么①和③都會包含在②中。這種情況的產生是由于Around的特殊性,它可以做類似于Before和After的操作。當安全性的判斷不通過時,可以阻止核心業務邏輯的調用,這是Before做不到的。

    ??


    ? ? ? ?使用xml可以對aop進行集中配置。很方便而簡單??梢詫λ械腶op進行配置,當然也可以分開到單獨的xml中進行配置。當需求變動時,不用修改代碼,只要重新配置aop,就可以完成修改操作。

    總結

    以上是生活随笔為你收集整理的Spring Aop实例之xml配置的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。