AOP的具體實踐-簡化結果返回的處理
原因:
以前學習Spring的時候著重學習過AOP概念,但是一直也沒有用上,唯一碰到過的就是Spring內建的事務管理。現在碰到過一些結果後面的操作適合用到,所以這裡就拿出來用一下,並且複習一下落下的知識。
概念:
基本概念這個博主解釋的比較清楚,如果有不懂的可以去看一下。https://blog.csdn.net/csh624366188/article/details/7651702
在我的認識裡,如果某些方法重複性特別高,可以抽象出來形成一個切面,則可以使用AOP來簡化程式碼,即在方法的某些部分動態的新增某些方法,起到簡化程式碼的作用。
具體需求:
專案的Service層透過webService獲取到資料,需要對獲取到的資料進行判斷處理,對其異常資訊作出記錄和丟擲異常。同時還需要在進入和結束方法的時候進行日誌記錄。
知識點:
配置方法:
在這裡使用的是註解的方式來配置的AOP,首先,要保證專案中除了Spring基本包以外還包含aopalliance-1.0.jar,aspectjrt-1.8.7.jar,aspectjweaver-1.8.7.jar,cglib-nodep-3.2.4.jar這四個jar包,這裡將其打包放到百度雲,如果有需要的可以去下載。連結: 密碼:0uea
Spring配置新增如下, 新增
注意aop不能新增到static方法上面。
// 掃描AOP <!-- 這裡配置後就不用再使用bean標籤配置bean了 --> <!-- 去哪個包掃描生成bean -->
首選建立切面類:其中的afterReturning就是主要的切面方法,用於對返回值進行判斷並且進行對應的操作,這樣可以不用再每個方法中都寫一次。
@Pointcut("execution(* com.dazhong.jnfy.alipay.service.impl.*.*(..))"):表示AOP會代理那些方法,這裡則表示com.dazhong.jnfy.alipay.service.impl包下面所有方法都會執行
@After("picter()"):後置通知
@Before("picter()"):前置通知
package com.dazhong.jnfy.alipay.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.json.JSONObject; import org.springframework.stereotype.Component; import com.dazhong.jnfy.alipay.exception.ConnectionException; import com.dazhong.jnfy.alipay.exception.ResultErrorException; import com.dazhong.utils.LogUtil;@Component @Aspect public class ServiceAop { @Pointcut("execution(* com.dazhong.jnfy.alipay.service.impl.*.*(..))") public void picter() { } /** * @Description: 對返回值進行處理 * @param point * @param rvt * @throws ResultErrorException */ @AfterReturning(returning = "rvt", pointcut = "execution(* com.dazhong.jnfy.alipay.service.impl.*.*(..))") public void afterReturning(JoinPoint point, Object rvt) throws Exception { // Object rvt則是方法返回值,這裡變數名稱要和註解retruning值相同 String[] strs = point.getSignature().getDeclaringTypeName().split("\."); String fullname = strs[strs.length - 1] + "." + point.getSignature().getName(); JSONObject root = (JSONObject) rvt; if (rvt == null) { throw new ConnectionException("WebService連線失敗" + fullname); } else if (!root.has("resultCode") || !root.get("resultCode").toString().equals("0")) { // 返回資料異常 throw new ResultErrorException("WebService 返回結果異常:" + root.toString()); } } @Before("picter()") public void before(JoinPoint point) { String[] strs = point.getSignature().getDeclaringTypeName().split("\."); String fullname = strs[strs.length - 1] + "." + point.getSignature().getName(); LogUtil.info("進入方法:" + fullname); } @After("picter()") public void after(JoinPoint point) { String[] strs = point.getSignature().getDeclaringTypeName().split("\."); String fullname = strs[strs.length - 1] + "." + point.getSignature().getName(); LogUtil.info("方法結束:" + fullname); } }
獲取引數/方法名:
如果需要獲取目標方法的引數/名字,則需要在切面的方法中新增變數 JoinPoint point,透過這個物件來進行獲取。
String allname = point.getSignature().getDeclaringTypeName(); // 獲取整個路徑 包名+類名 System.out.println(allname); String[] split = allname.split("\."); System.out.println("目標方法:" + split[split.length - 1] + "." + point.getSignature().getName()); // point.getSignature().getName() 獲取方法名 System.out.println("@Before:引數為:" + Arrays.toString(point.getArgs())); // 獲取目標方法的引數 point.getArgs()
結果: 紅框內容就是AOP自動新增的。
剩餘程式碼:
目標方法:
public JSONObject test() throws Exception{ System.out.println("目標方法執行"); JSONObject js = new JSONObject(); js.put("resultCode", "-1"); return js; }
測試方法:
public static void main(String[] args) { ApplicationContext appCtx = new ClassPathXmlApplicationContext("applicationContext.xml"); ReserveServiceImpl b = (ReserveServiceImpl) appCtx.getBean("reserveServiceImpl"); JSONObject js = new JSONObject(); js.put("s", "111"); try { //JSONObject allDept = b.getDocterByTimeAndDept("YYKS002", "20180711"); b.test(); } catch (Exception e) { System.out.println(e); } }
原文出處:https://www.cnblogs.com/liyuhui-Z/p/9468756.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2819/viewspace-2811743/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- go 如何處理資料庫返回的多結果集Go資料庫
- ?laravel8 中介軟體對處理返回結果或異常進行格式統一處理Laravel
- python使用flask接收前端資料,處理後返回結果PythonFlask前端
- linq返回結果集中增加自增序列,該如何處理
- Jdbc引入連線池,JdbcTemplate處理結果集的優化JDBC優化
- JavaScript中Typeof返回的結果JavaScript
- AJAX的同步返回結果值
- Oracle的RMAN總結繼續,具體實踐開始Oracle
- CSS 預處理語言的模組化實踐CSS
- CSS預處理語言的模組化實踐CSS
- MyBatis 返回結果MyBatis
- springboot2.0-統一處理返回結果和異常情況Spring Boot
- JAVA資料庫處理(連線,資料查詢,結果集返回)Java資料庫
- iOS FMDB有返回結果集和無返回結果集iOS
- ASP.NET Core WebApi返回結果統一包裝實踐ASP.NETWebAPI
- 動態返回結果的檢視
- Spark Task 的執行流程④ - task 結果的處理Spark
- Mysql效能最佳化(三)--explain返回的結果說明MySqlAI
- unity中取樣深度圖的結果處理Unity
- [譯] 搜尋結果頁的最佳實踐
- 基於 Python 的簡單自然語言處理實踐Python自然語言處理
- 請教分散式事務的具體處理:急!!!!分散式
- 通用結果類用於返回響應結果
- 封裝ResultVO實現統一返回結果封裝
- 關於disruptor的事件釋出的返回結果事件
- AOP的簡單實現
- 動態sql查詢結果多行的處理情況SQL
- 自然語言處理的最佳實踐自然語言處理
- JavaScript 錯誤處理的最佳實踐JavaScript
- 在敏捷開發中的風險控制的具體實踐敏捷
- (反射+內省機制的運用)處理jdbc的結果集反射JDBC
- Egret應用開發實踐(03) MVC 模組化具體實現MVC
- 自然語言處理第一次實驗結果自然語言處理
- 處理ajax返回的js程式碼JS
- FastJsonHttpMessageConverter造成返回結果多次序列化的問題ASTJSONHTTP
- RESTful實踐(具體應用)思考REST
- 尋找寫程式碼感覺(六)之列表查詢介面開發及返回結果的統一處理
- Python返回多個結果Python