1. 程式人生 > >spring aop的@Before,@Around,@After,@AfterReturn,@AfterThrowing執行順序

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

1.AOP的基本概念

切面(Aspect) :通知和切入點共同組成了切面(aspect)。可以從註解方式來理解,程式碼如下。 


@aspect為類上面的註解——切面 
@pointcut(…)——切入點。為此類內一個空方法上面的註解。可以把攔截的地址表示式表示為方法簽名,利於使用起來方便。 
@[email protected]等——通知。為此類下面的方法上面的註解。 

三者在一塊組成一個切面。

連線點(Joinpoint) :程式能夠應用通知的一個point,這些“point”就是連線點,例如方法被呼叫時、異常被丟擲時等等。——可以理解為被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 註解說明

2.1 @Aspect

作用是把當前類標識為一個切面供容器讀取

2.2 @Before
標識一個前置增強方法,相當於BeforeAdvice的功能,相似功能的還有

2.3 @AfterReturning

後置增強,相當於AfterReturningAdvice,方法正常退出時執行

2.4 @AfterThrowing

異常丟擲增強,相當於ThrowsAdvice

2.5 @After

final增強,不管是丟擲異常或者正常退出都會執行

2.6 @Around

環繞增強,相當於MethodInterceptor

2.7 @DeclareParents

引介增強,相當於IntroductionInterceptor

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

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

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

4 更多切點函式

除了execution(),Spring中還支援其他多個函式,這裡列出名稱和簡單介紹,以方便根據需要進行更詳細的查詢

4.1 @annotation()

表示標註了指定註解的目標類方法

例如 @annotation(org.springframework.transaction.annotation.Transactional) 表示標註了@Transactional的方法

4.2 args()

通過目標類方法的引數型別指定切點

例如 args(String) 表示有且僅有一個String型引數的方法

4.3 @args()

通過目標類引數的物件型別是否標註了指定註解指定切點

如 @args(org.springframework.stereotype.Service) 表示有且僅有一個標註了@Service的類引數的方法

4.4 within()

通過類名指定切點

如 with(examples.chap03.Horseman) 表示Horseman的所有方法

4.5 target()

通過類名指定,同時包含所有子類

如 target(examples.chap03.Horseman)  且Elephantman extends Horseman,則兩個類的所有方法都匹配

4.6 @within()

匹配標註了指定註解的類及其所有子類

如 @within(org.springframework.stereotype.Service) 給Horseman加上@Service標註,則Horseman和Elephantman 的所有方法都匹配

4.7 @target()

所有標註了指定註解的類

如 @target(org.springframework.stereotype.Service) 表示所有標註了@Service的類的所有方法

4.8 this()

大部分時候和target()相同,區別是this是在執行時生成代理類後,才判斷代理類與指定的物件型別是否匹配

參考博文: 
1.小曹學spring–基於@AspectJ和Schema的AOP
2.徹底征服 Spring AOP 之 理論篇
3.利用Spring AOP自定義註解解決日誌和簽名校驗
4.Spring AOP @Before @Around @After 等 advice 的執行順序

相關推薦

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

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

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

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

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之面向切面程式設計指定切面執行順序

前言 面向切面程式設計,如果出現需要在切面中加如新的功能,但是又不想進入原來切面進行程式碼新增。這裡就可以新建一個切面類,指向需要新增功能的切點上即可,但如果你需要讓新增的切面方法在原來切面之前執行,那麼就可以通過@Order進行指定值,值越大越先執行。 原切面類 /** * MyAspect 簡要描

Spring 生命週期 各種初始化方法 執行順序

0、BeanFactoryPostProcessor呼叫postProcessBeanFactory方法 1、BeanPostProcessor#postProcessBeforeInitialization (1.1 @PostConstruct(CommonAnn

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

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

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

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

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

spring中過濾器(filter)、攔截器(interceptor)和切面(aop)的執行順序

1.程式執行的順序是先進過濾器,再進攔截器,最後進切面。注意:如果攔截器中preHandle方法返回的為false時,則無法進入切面,例子如下 @RestController @RequestMapping("/user") public class UserController {

Spring AOP 執行順序

 兩個不同優先順序aop是攔截登入方法,執行順序。 package com.leusysm.mgr.interceptor; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoin

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

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

Spring Boot 中使用 Spring AOP 和 AspectJ 來測量方法的執行時間

原文連結:https://dzone.com/articles/logging-average-method-execution-times-via-aspectj 作者:Murat Derman 譯者:Darren Luo 想要了解更多有關測量方法執行時間的資訊?檢視本教

Spring AOP 切面編程記錄日誌和接口執行時間

poi follow 大牛 日誌打印 mave ont type exceptio throw 最近客戶現在提出系統訪問非常慢,需要優化提升訪問速度,在排查了nginx、tomcat內存和服務器負載之後,判斷是數據庫查詢速度慢,進一步排查發現是因為部分視圖和表查詢特別慢導致

2018年最後一天 VsCode中執行nodeJs程式碼的簡單方法 Pgsql和Mysql的對比 Tomcat的最大併發數 Spring AOP不起作用原因

發現2017的隨筆總結依舊適用,想堅持每天寫點東西分享,但感覺每天能原創分享的內容真的不多,尤其是要把自己想分享的內容寫清楚也需要額外花費很多的時間,這讓本來平時就工作比較忙的自己疲於應付,於是乎就轉載自己看到的一些好的文章分享,甚至有些文章自己都沒完全看完就發,湊合著完成了任務,但自己的成就感很低。因此我不

java學習筆記——springaop、切面類中五種通知的使用、存在多個切面類時切面通知的執行順序、註釋的方式定義切面類與通知、xml配置的方式定義切面類與通知

3、AOP AOP:(Aspect Oriented Programming)面向切面程式設計; OOP:(Object Oriented Programming )面向物件程式設計; 面向切面程式設計:基於OOP基礎之上新的程式設計思想; 指在程式執行期間,