1. 程式人生 > >勤勞的搬運工--SpringBootAOP--面向切面

勤勞的搬運工--SpringBootAOP--面向切面

原文出自 https://blog.csdn.net/zlxls/article/details/79756520

在開始之前,我們先把需要的jar包新增到工程裡。新增Maven依賴如下:

  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-aop</artifactId>
  4. </dependency>
接下來,我們進入正題。這裡的涉及的通知型別有:前置通知、後置最終通知、後置返回通知、後置異常通知、環繞通知,下面我們就具體的來看一下怎麼在SpringBoot中新增這些通知。
首先我們先建立一個Aspect切面類:
  1. @Component
  2. @Aspect
  3. publicclass WebControllerAop {  
  4. }  
指定切點:
  1. //匹配com.zkn.learnspringboot.web.controller包及其子包下的所有類的所有方法
  2. @Pointcut("execution(* com.zkn.learnspringboot.web.controller..*.*(..))")  
  3. publicvoid executeService(){  
  4. }  
接著我們再建立一個Controller請求處理類:
  1. package com.zkn.learnspringboot.web.controller;  
  2. import org.springframework.web.bind.annotation.RequestMapping;  
  3. import org.springframework.web.bind.annotation.RestController;  
  4. /** 
  5.  * Created by zkn on 2016/11/19. 
  6.  */
  7. @RestController
  8. @RequestMapping("/aop")  
  9. publicclass AopTestController {  
  10. }  

前置通知

配置前置通知:
  1. /** 
  2.  * 前置通知,方法呼叫前被呼叫 
  3.  * @param joinPoint 
  4.  */
  5. @Before("executeService()"
    )  
  6. publicvoid doBeforeAdvice(JoinPoint joinPoint){  
  7.     System.out.println("我是前置通知!!!");  
  8.     //獲取目標方法的引數資訊
  9.     Object[] obj = joinPoint.getArgs();  
  10.     //AOP代理類的資訊
  11.     joinPoint.getThis();  
  12.     //代理的目標物件
  13.     joinPoint.getTarget();  
  14.     //用的最多 通知的簽名
  15.     Signature signature = joinPoint.getSignature();  
  16.     //代理的是哪一個方法
  17.     System.out.println(signature.getName());  
  18.     //AOP代理類的名字
  19.     System.out.println(signature.getDeclaringTypeName());  
  20.     //AOP代理類的類(class)資訊
  21.     signature.getDeclaringType();  
  22.     //獲取RequestAttributes
  23.     RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();  
  24.     //從獲取RequestAttributes中獲取HttpServletRequest的資訊
  25.     HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);  
  26.     //如果要獲取Session資訊的話,可以這樣寫:
  27.     //HttpSession session = (HttpSession) requestAttributes.resolveReference(RequestAttributes.REFERENCE_SESSION);
  28.     Enumeration<String> enumeration = request.getParameterNames();  
  29.     Map<String,String> parameterMap = Maps.newHashMap();  
  30.     while (enumeration.hasMoreElements()){  
  31.         String parameter = enumeration.nextElement();  
  32.         parameterMap.put(parameter,request.getParameter(parameter));  
  33.     }  
  34.     String str = JSON.toJSONString(parameterMap);  
  35.     if(obj.length > 0) {  
  36.         System.out.println("請求的引數資訊為:"+str);  
  37.     }  
  38. }  
注意:這裡用到了JoinPoint和RequestContextHolder。通過JoinPoint可以獲得通知的簽名信息,如目標方法名、目標方法引數資訊等。通過RequestContextHolder來獲取請求資訊,Session資訊。接下來我們在Controller類裡新增一個請求處理方法來測試一下前置通知:
  1. @RequestMapping("/testBeforeService.do")  
  2. public String testBeforeService(String key,String value){  
  3.     return"key="+key+"  value="+value;  
  4. }  
前置通知攔截結果如下所示:

後置返回通知

配置後置返回通知的程式碼如下:
  1. /** 
  2.  * 後置返回通知 
  3.  * 這裡需要注意的是: 
  4.  *      如果引數中的第一個引數為JoinPoint,則第二個引數為返回值的資訊 
  5.  *      如果引數中的第一個引數不為JoinPoint,則第一個引數為returning中對應的引數 
  6.  * returning 限定了只有目標方法返回值與通知方法相應引數型別時才能執行後置返回通知,否則不執行,對於returning對應的通知方法引數為Object型別將匹配任何目標返回值 
  7.  * @param joinPoint 
  8.  * @param keys 
  9.  */
  10. @AfterReturning(value = "execution(* com.zkn.learnspringboot.web.controller..*.*(..))",returning = "keys")  
  11. publicvoid doAfterReturningAdvice1(JoinPoint joinPoint,Object keys){  
  12.     System.out.println("第一個後置返回通知的返回值:"+keys);  
  13. }  
  14. @AfterReturning(value = "execution(* com.zkn.learnspringboot.web.controller..*.*(..))",returning = "keys",argNames = "keys")  
  15. publicvoid doAfterReturningAdvice2(String keys){  
  16.     System.out.println("第二個後置返回通知的返回值:"+keys);  
  17. }  
Controller裡新增響應的請求處理資訊來測試後置返回通知:
  1. @RequestMapping("/testAfterReturning.do")  
  2. public String testAfterReturning(String key){  
  3.     return"key=: "+key;  
  4. }  
  5. @RequestMapping("/testAfterReturning01.do")  
  6. public Integer testAfterReturning01(Integer key){  
  7.     return key;  
  8. }  
當傳送請求為:http://localhost:8001/aop/testAfterReturning.do?key=testsss&value=855sss時,處理結果如圖所示:當傳送請求為:http://localhost:8001/aop/testAfterReturning01.do?key=55553&value=855sss時,處理結果如圖所示:

後置異常通知

後置異常通知的配置方式如下:
  1. /** 
  2.  * 後置異常通知 
  3.  *  定義一個名字,該名字用於匹配通知實現方法的一個引數名,當目標方法丟擲異常返回後,將把目標方法丟擲的異常傳給通知方法; 
  4.  *  throwing 限定了只有目標方法丟擲的異常與通知方法相應引數異常型別時才能執行後置異常通知,否則不執行, 
  5.  *      對於throwing對應的通知方法引數為Throwable型別將匹配任何異常。 
  6.  * @param joinPoint 
  7.  * @param exception 
  8.  */
  9. @AfterThrowing(value = "executeService()",throwing = "exception")  
  10. publicvoid doAfterThrowingAdvice(JoinPoint joinPoint,Throwable exception){  
  11.     //目標方法名:
  12.     System.out.println(joinPoint.getSignature().getName());  
  13. 相關推薦

    勤勞搬運工--SpringBootAOP--面向切面

    原文出自 https://blog.csdn.net/zlxls/article/details/79756520在開始之前,我們先把需要的jar包新增到工程裡。新增Maven依賴如下:<dependency>    <groupId>org.spri

    AOP面向切面編程

    文件 library 執行方法 color ise cati 字符 arm ado 首先是下載準備好三個dll類庫 Microsoft.Practices.EnterpriseLibrary.PolicyInjection.dll Microsoft.Practic

    什麽叫AOP(面向切面編程)?

    增強 單點 調用 改變 spring 開發 手動 aop思想 生成 spring的AOP面向切面編程,實現在不改變代碼的情況下完成對方法的增強。比較常用的就是spring的聲明式事務管理,底層通過AOP實現,避免了我們每次都要手動開啟事物,提交事務的重復性代碼,使得開發邏輯

    關於Java 實現抽象類的抽象方法的特性的利用---面向切面

    light 統計 其實在 mybatis print point pointcut myba pan 今天看工作看代碼突然有了以下設想: /** * Created by zq on 2017/5/25. * 抽象類 */ public abstract clas

    面向切面編程(AOP)的理解

    bottom 實現原理 cell strong ora max images 處理 style AOP是什麽(Aspect Oriented Programming) AOP是一種編程範式,提供從還有一個角度來考慮程序結構以完好面向對象編程(OOP)。AO

    面向切面編程

    沒有 ida rgs 容器 簡潔 action src 處理 業務邏輯 在傳統的編寫業務邏輯處理代碼時,我們通常會習慣性地做幾件事情:日誌記錄、事務控制及權限控制等,然後才是編寫核心的業務邏輯處理代碼。當代碼編寫完成回頭再看時,不禁發現,揚揚灑灑上百行代碼中,真正用於核心業

    Python面向切面編程-語法層面和functools模塊

    start wrap data author rom pos port turn imp 1,Python語法層面對面向切面編程的支持(方法名裝飾後改變為log) __author__ = 'Administrator' import tim

    WebApi client 的面向切面編程

    web.Net的面向切面編程.Net的服務端應用AOP很常見,在Asp.net MVC與Asp.net WebApi等新框架裏到處都有AOP的影子,我們可以把一個服務方法“切”為很多面,日誌面、驗證面、請求方式處理、接口業務實現等多個面,有一些面可以使用過濾器特性(FilterAttribute)進行編寫,然

    面向切面編程(AOP)

    edi public throwable 預編譯 業務 action cati pro eth 1.AOP的簡單理解   AOP全稱:Aspect Oriented Programming;   面向切面編程是通過預編譯方式和運行期動態代理的方式實現程序功能的統一維護的一種

    spring入門-AOP 面向切面編程

    面向 das let cau pri log exce lib xxx AOP 面向切面編程 在日常開發中最後將業務邏輯定義在一個專門的service包下,而實現定義在service包下的impl包中, 服務接口以IXXXService形式,而服務實現就是XXXServ

    【spring源碼學習】spring的AOP面向切面編程的實現解析

    內部 遠程調用 關註 add aps 文件 uem 連接 row 一:Advice(通知)(1)定義在連接點做什麽,為切面增強提供織入接口。在spring aop中主要描述圍繞方法調用而註入的切面行為。(2)spring定義了幾個時刻織入增強行為的接口??=>org.

    Spring面向切面編程

    springAOP面向切面編程,可以說是oop的完善補充,眾所周知,面向對象編程特點是封裝繼承和多態,構建了一種對象層次結構,可以很好的組織代碼,通過繼承關系實現代碼重用,但程序中總會有以一些重復的代碼不太方便使用繼承將他們重用和管理起來,這些代碼的功能重復且需要用在不同的地方,雖然可以將它封裝成公共函數,但

    AOP 面向切面編程詳解

    準則 rim 實現 handle 建議 cal ring 模式 ide 引言 對類(class)增強的手段通常分為以下三類 1.繼承 子類通過繼承父類或者實現接口對類進行增強 2.裝飾者模式(Wrapper) 常用於對類的某個方法進行重寫,以實現更強大的功能.常用於

    轉:面向切面編程AOP的理解

    glib 之間 切入點 targe con rgs 強制 sof 作用 AOP AOP(Aspect Oriented Programming),即面向切面編程,可以說是OOP(Object Oriented Programming,面向對象編程)的補充和完善。OOP引入

    Spring(三)--AOP【面向切面編程】、通知類型及使用、切入點表達式

    1.3 一聲 重復 信息 術語 臃腫 lib pac fin 1.概念:Aspect Oriented Programming 面向切面編程 在方法的前後添加方法 2.作用:本質上來說是一種簡化代碼的方式 繼承機制 封裝方法 動態代理

    Spring框架——AOP(面向切面編程)詳解

    通過 cts ssi 沒有 object 引入 集中 method 可能 1 AOP概述 ●AOP(Aspect-Oriented Programming,面向切面編程):是一種新的方法論,是對傳統 OOP(Object-Oriented Programming,面向對象

    AOP面向切面編程筆記

    本質 join 2.0 jdb ntc 通知 nim arrays win 1.AOP概念:Aspect Oriented Programming 面向切面編程 2.作用:本質上來說是一種簡化代碼的方式 繼承機制 封裝方法 動態代理 …… 3.情景舉例 ①數學計算器接口[

    菜鳥認知--AOP面向切面編程

    intro 面向切面 2-2 引入 bject 例子 特定 過程 通知 AOP:   將多個程序中相同工作的模塊從程序中分離出來。 引用他人的良好例子: 1.傳統步驟 2.AOP AOP將驗證用戶的步驟單獨拿出來和程序分離,從而達到低耦合。 AOP的一些概念: 1.

    Spring框架(四)AOP面向切面編程

    維護 ng- mem 需要 函數 cti oop classpath 實現 一.前言 在以前的項目中,很少去關註spring aop的具體實現與理論,只是簡單了解了一下什麽是aop具體怎麽用,看到了一篇博文寫得還不錯,就轉載來學習一下,博文地址:http://w

    spring中面向切面編程(AOP)的個人理解

    .com throw logs ima 正則表達式 正則 ring 菜刀 整合 面向切面編程AOP,是spring的一大特點 Aspect切面:封裝共性功能的(增強功能的)類 Advice通過:切面類中封裝的增強功能的方法。 PointCut:切入點,是一個集合的概念,