1. 程式人生 > >spring aop的@Before,@Around,@After,@AfterReturn,@AfterThrowing的理解

spring aop的@Before,@Around,@After,@AfterReturn,@AfterThrowing的理解

aop的這幾個註解的使用非常常見,但是他們的執行順序,以及作為我們進入核心程式碼前的校驗,是如何在校驗失敗不然他進入核心方法的?部落格上確實有不少講解的很詳細,我在結尾也會推薦幾篇。這裡就幾個重要的點和不明的點做下說明,前事不忘後事之師!

1.AOP的基本概念

切面(Aspect) :通知(advice)和切入點(pointcut)共同組成了切面(aspect),時間、地點和要發生的“故事”。可以從註解方式來理解,程式碼如下。
@aspect為類上面的註解——切面
@pointcut(…)——切入點。為此類內一個空方法上面的註解。可以把攔截的地址表示式表示為方法簽名,利於使用起來方便。
@

[email protected]等——通知。為此類下面的方法上面的註解。
三者在一塊組成一個切面。

@Aspect
public class ExampleAspect {

  @Pointcut("execution(* com.psjay.example.spring.aop.*.*(..))")
  public void aPointcut() {
  }

  @Before("aPointcut()")
  public void beforeAdvice() {
      System.out.println("before advice is executed!"
); } }



連線點(Joinpoint) :程式能夠應用通知的一個“時機”,這些“時機”就是連線點,例如方法被呼叫時、異常被丟擲時等等。——可以理解為被aop攔截的類或者方法就是連線點。

通知(Advice) :通知定義了切面是什麼以及何時使用。描述了切面要完成的工作和何時需要執行這個工作。——可以理解為被註解有@Before等advice註解的安全校驗的方法,攔截了過來的請求要做什麼邏輯的校驗。

切入點(Pointcut) :通知定義了切面要發生的“故事”和時間,那麼切入點就定義了“故事”發生的地點,例如某個類或方法的名稱。——可以理解為切面切向哪裡?是個類或者某層的包路徑。
目標物件(Target Object)

:即被通知的物件。
AOP代理(AOP Proxy) 在Spring AOP中有兩種代理方式,JDK動態代理和CGLIB代理。預設情況下,TargetObject實現了介面時,則採用JDK動態代理;反之,採用CGLIB代理。
織入(Weaving)把切面應用到目標物件來建立新的代理物件的過程,織入一般發生在如下幾個時機:
  (1)編譯時:當一個類檔案被編譯時進行織入,這需要特殊的編譯器才能做到,例如AspectJ的織入編譯器;
  (2)類載入時:使用特殊的ClassLoader在目標類被載入到程式之前增強類的位元組程式碼;
  (3)執行時:切面在執行的某個時刻被織入,SpringAOP就是以這種方式織入切面的,原理是使用了JDK的動態代理。

2 通知(Advice)型別的說明

@Before 前置通知(Before advice) :在某連線點(JoinPoint)——核心程式碼(類或者方法)之前執行的通知,但這個通知不能阻止連線點前的執行。為啥不能阻止執行緒進入核心程式碼呢?因為@Before註解的方法入參不能傳ProceedingJoinPoint,而只能傳入JoinPoint。要知道從aop走到核心程式碼就是通過呼叫ProceedingJionPoint的proceed()方法。而JoinPoint沒有這個方法。
這裡牽扯區別這兩個類:Proceedingjoinpoint 繼承了 JoinPoint 。是在JoinPoint的基礎上暴露出 proceed 這個方法。proceed很重要,這個是aop代理鏈執行的方法。暴露出這個方法,就能支援 aop:around 這種切面(而其他的幾種切面只需要用到JoinPoint,這跟切面型別有關), 能決定是否走代理鏈還是走自己攔截的其他邏輯。建議看一下 JdkDynamicAopProxy的invoke方法,瞭解一下代理鏈的執行原理。這樣你就能明白 proceed方法的重要性。

@After 後通知(After advice) :當某連線點退出的時候執行的通知(不論是正常返回還是異常退出)。

@AfterReturning 返回後通知(After return advice) :在某連線點正常完成後執行的通知,不包括丟擲異常的情況。

@Around 環繞通知(Around advice) :包圍一個連線點的通知,類似Web中Servlet規範中的Filter的doFilter方法。可以在方法的呼叫前後完成自定義的行為,也可以選擇不執行。這時aop的最重要的,最常用的註解。用這個註解的方法入參傳的是ProceedingJionPoint pjp,可以決定當前執行緒能否進入核心方法中——通過呼叫pjp.proceed();

@AfterThrowing 丟擲異常後通知(After throwing advice) : 在方法丟擲異常退出時執行的通知。

3 advice(通知)註解的執行先後順序

這裡說下簡單情況——針對一個方法只被一個aspect類攔截時,aspect類內部的 advice 將按照以下的順序進行執行情況如下:
這裡寫圖片描述

這裡寫圖片描述
解釋:執行到核心業務方法或者類時,會先執行AOP。在aop的邏輯內,先走@Around註解的方法。然後是@Before註解的方法,然後這兩個都通過了,走核心程式碼,核心程式碼走完,無論核心有沒有返回值,都會走@After方法。然後如果程式無異常,正常返回就走@AfterReturn,有異常就走@AfterThrowing。

4 在aop中校驗不通過如何不讓程式進入核心程式碼?

通過aop中註解的執行的先後順序我們知道,校驗發生在核心程式碼前面的只剩下兩個——@Before,@Around。
@Before : 這個註解只有在異常時才不會走核心方法——連線點。正常@Before無法阻止當前執行緒進入連線點。
@Around : 這個註解在連線點前後執行。並且註解的方法傳入的ProceedingJionPoint 類中封裝的代理方法proceed()可以讓當前執行緒從aop方法轉到連線點——核心程式碼方法。所以一般我們用這個註解,如果aop的安全校驗不通過,則不呼叫proceed()方法,就永遠不會進入連線點。
除此外,要注意除了Around註解的方法可以傳ProceedingJionPoint 外,別的幾個都不能傳這個類。但是普通的資料型別是不限制的。註解的方法的返回值也不限制,可以自由限制。

相關推薦

spring aop的@Before,@Around,@After,@AfterReturn,@AfterThrowing理解

aop的這幾個註解的使用非常常見,但是他們的執行順序,以及作為我們進入核心程式碼前的校驗,是如何在校驗失敗不然他進入核心方法的?部落格上確實有不少講解的很詳細,我在結尾也會推薦幾篇。這裡就幾個重要的點和不明的點做下說明,前事不忘後事之師! 1.AO

spring aop的@Before,@Around,@After,@AfterReturn,@AfterThrowing執行順序

1.AOP的基本概念切面(Aspect) :通知和切入點共同組成了切面(aspect)。可以從註解方式來理解,程式碼如下。 @aspect為類上面的註解——切面 @pointcut(…)——切入點。為此類內一個空方法上面的註解。可以把攔截的地址表示式表示為方法簽名,利於使用起

Spring AOP @Before @Around @After 等 advice 的執行順序

繼續 case tco ann cto order software clas spec 用過spring框架進行開發的人,多多少少會使用過它的AOP功能,都知道有@Before、@Around和@After等advice。最近,為了實現項目中的輸出日誌和權限控制這兩個需求

Spring AOP @Before @Around @After 等 advice 的執行順序 侵立刪

用過spring框架進行開發的人,多多少少會使用過它的AOP功能,都知道有@Before、@Around和@After等advice。最近,為了實現專案中的輸出日誌和許可權控制這兩個需求,我也使用到了AOP功能。我使用到了@Before、@Around這兩個advic

Spring Aop例項@Around、@Before、@After、@AfterReturning 、@AfterThrowing註解方式配置

用過spring框架進行開發的人,多多少少會使用過它的AOP功能,都知道有@Before、@Around和@After等advice。最近,為了實現專案中的輸出日誌和許可權控制這兩個需求,我也使用到了AOP功能。我使用到了@Before、@Around這兩個advice。但在,使用過程中,卻

spring AOP的@Around輸出請求引數和返回引數

spring 的AOP是通過cglib動態代理和jdk的動態代理實現的。 先把我的列印日誌程式碼貼出來 package com.zhd.exploit.api.config; import java.util.HashMap; import java.util.Map; imp

spring aop before 返回

1.aop獲取request,response,session等 public class SysContext { private static ThreadLocal<HttpServle

Spring AOP @Around @Before @After 區別

npoi -i ati all mini destroy 3.0 ota classpath 此段小代碼演示了spring aop中@Around @Before @After三個註解的區別@Before是在所攔截方法執行之前執行一段邏輯。@After 是在所攔截方法執行之

Spring Aop的三個註解:@Around,@Before,@After

如果 aop 被調用 調用 pri npoi 能說 說明 其中 最近抽時間看了一些aop。好像翻譯叫做切片技術。大概也能說明白是什麽意思。 其中,有三個註解需要註意,分別是@Around,@Before,@After。 其中 @Around進行切片捕捉,可以捕捉到joinp

AspectJ 切面註解中五種通知註解:@Before、@After、@AfterRunning、@AfterThrowing、@Around

要在 Spring 中宣告 AspectJ 切面, 只需要在 IOC 容器中將切面宣告為 Bean 例項. 當在 Spring IOC 容器中初始化 AspectJ 切面之後, Spring IOC 容器就會為那些與 AspectJ 切面相匹配的 Bean 建立

深入理解Spring AOP之二代理對象生成

gets code 網上 none work class als post 產生 深入理解Spring AOP之二代理對象生成 spring代理對象 上一篇博客中講到了Spring的一些基本概念和初步講了實現方

spring aop理解

理解 前置增強 修改 需要 技術 asp strong intro cut spring aop的相關概念(所有的概念都是為了生成代理類這個過程所需要的信息的抽象):   1.Targer:目標對象。被代理的對象。   2.Advice:增強/通知。就是為目標對象擴展的功能

SpringAOP的一個通俗易懂的理解(轉)

學會 事物 nbsp 連接 新的 之前 天都 這不 proxy 這是看到的一個最易懂得AOP簡介了,適合初學者理解。 轉自:http://www.verydemo.com/demo_c143_i20837.html 1.我所知道的aop   初看aop,上來就是一大堆術語,

Spring AOP概念理解

目錄   1.我所知道的aop 2.為什麼用aop 3.那些aop的術語   1.通知(Advice)   2.連線點(JoinPoint)   3.切入點(Pointcut)   4.切面(Aspect)   5.引入(introduction)

SpringAOP由淺到深的理解;

最近公司工作有個坑,需要在原來系統的redis接入更換cacheCloun;但是原來設計的快取嵌入專案多,而此次需求只需更換接入的ip和埠即可;所以考慮到運用Spring的AOP面向切面程式設計;變來複習一波這個Spring的基本原來AOP; 原文地址:https://www.cnblogs.c

理解使用beforeafter偽類實現小三角形氣泡框

先來理解before和after偽類的用法吧,before從字面上的意思可以理解為前面的意思,它一般和content屬性一起使用,把內容插入在其他元素的前面,同理after的含義就是把內容插入到其他元素的後面了。先來看一個簡單的demo,如下程式碼: <!DOCTYPE html PUBLIC

Spring AOP不進入before和業務方法,卻進入其他切面的問題

由於業務需求,需要編寫一個AOP用來記錄一些外部介面的呼叫日誌. 首先是引入切面要用到的jar包,maven工程加入如下所示: 然後是配置檔案,由於要在controller層加上切面,因此需要在springMVC的配置檔案上加上 <aop:aspectj-autoproxy pro

Spring AOP面向切面程式設計:理解篇(一看就明白)

一、到底什麼是AOP(面向切面程式設計)? 無論在學習或者面試的時候,大家都會張口說spring的特性AOP和IOC(控制反轉咱們下一篇講),有些大神理解的很到位,但是對於大多數初中級工程師來講還是模糊階段,但是為什麼會有AOP這種技術呢?傻瓜都知道:為了開發者的方便!

SSM框架之Spring-AOP理解與基本使用

logger SSM 框架學習 (Spring篇) 一、我對AOP的理解 什麼是切面程式設計:我們把一段程式執行流程比喻成一條水果大小分揀流水線,而AOP的思想就是可以在這個流水線的某個點設定一個檢查點,或者說大小過濾器,不同的過濾器能過濾不同大小的

Spring AOP @Aspect織入不生效,不執行前置增強織入@Before

想寫一個AOP,主要有2個用意,, 第一個用意是做後端的防表單重複提交的token驗證。 第二個用意是對後臺JSR303 Validator的校驗結果做一個統一處理,不想把對校驗結果的處理分散在每個controller方法中   @ResponseBody @Request