1. 程式人生 > >AspectJ形式的Pointcut--spring揭祕學習筆記

AspectJ形式的Pointcut--spring揭祕學習筆記

@AspectJ形式的Pointcut的宣告包含如下兩個部分:

  • Pointcut Expression:其載體為@Pointcut,該註解是方法級別的註解,所以Pointcut Expression不能脫離某個方法單獨宣告,被附著的的方法的名稱是Pointcut Designature。Pointcut Expression是真正規定Pointcut匹配規則的地方,可以通過 @Pointcut直接制定AspectJ形式的Pointcut表示式;AspectJ形式的Pointcut由以下兩部分組成:
    • Pointcut標誌符:標誌符以什麼行為來匹配表示式(execution|this|target|args)
      -表示式匹配模式:具體的匹配規則
  • Pointcut Signature:Pointcut的附著方法,它是Pointcut Expression的載體,該方法除了返回型別必須是void之外,沒有其他的限制,訪問修飾符的語義和Java相同。在當前的AspectJ定義中可以取代重複的Pointcut的定義。
    Pointcut可以通過&&、||、 !運算子進行邏輯間的運算。

@AspectJ形式的Pointcut表示式的識別符號
1. execution:Spring Aop只支援方法執行類別的Jointpoint,所以execution將是用到的最常多的識別符號,其定義方式如下:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern (param-pattern) throws-pattern?):其中的?表示可以省略的項,返回型別、方法名稱、引數是匹配模式必須指定的。
除此之外,還可以使用和. .萬用字元,其中

可以用於任何部分匹配模式中,可以匹配多個字元(及一個詞),eg:
execution(* ( )):代表任意的返回型別,任意的方法,任意的引數
. .萬用字元可以用在兩個位置上,一個是declaring-type-pattern規定的位置,一個是param-pattern規定的位置,如用在declaring-type-pattern的位置上,則可以表示多個層次結構的型別宣告,eg:
(execution (void cn.spring21..doSomething( ))) //代表指定到cn.spring21*這一層下*的多有型別
(execution(void cn.spring21...doSomething(
))) //代表指定到cn.spring21這一層及其所有的子層次的型別
.. 若是用在引數列表位置,則表示0個或者多個引數,型別不限,eg:
execution(void doSomething(String,*)) //匹配兩個引數的doSomething()方法,第一個引數是String型別,第二個引數是任意型別;
execution(void doSomething(..,String)) //匹配擁有多個引數的doSomething()方法,前面的引數的個數和型別不限,最後一個引數的型別必須是String型別;
execution(void doSomething(*,String,..)) //匹配擁有多個引數的doSomething()方法,第一個引數的型別不限,第二個引數必須為String型別,後面的引數的個數和型別都不限;
2.within識別符號只接受型別宣告,他將會匹配指定型別下的所有的Jointpoint。但是因為SpringAop只支援方法級別的Jointpint,所以在我們為within指定某個類後,它將匹配指定類所宣告的所有方法執行,eg:
within(cn.spring21.aop.target.MockTarget) //該Pointcut表示式在SpringAop中將會匹配MockTarget類中的所有的方法宣告,除此之外還可以結合上面的* 和.. 進行擴充套件
3.this和target:若Object1和Object2都呼叫了Object3方法,在ApsectJ中this指的是方法呼叫方:Object1和Objection2,target指的是方法具體的執行呼叫方;this(Object1)&&target(Object3),表示只有在Object1呼叫Object3的方法時時才會執行匹配,Object2呼叫Object3的方法是不會執行匹配;而在SpringAop中this和target的語義有所差別,下圖是Spring 官方文件中的截圖:
這裡寫圖片描述
可以看出:this和target都是限制匹配joinpoint的方式,但是this限制的是對於給出型別的SpringAop代理類的限制(我猜想是在一個原始目標類實現多個介面時,在為其生成代理物件並注入到Spring的IoC容器之後,之後我們業務邏輯中使用的就是代理類物件,當我們執行代理類的方法時,SpringAop使用this(原始類實現的某一個介面),這種Pointcut定義方式對代理類中的特定介面中定義的方法進行攔截,並且執行Advice中定義的邏輯),而target限制的是對於原始類中的方法的匹配,與哪一個特定的介面都沒有關係;
這裡寫圖片描述
這裡寫圖片描述
4.args:該識別符號的作用是捕捉擁有特定型別的、特訂引數個數的方法級的Joinpoint,而不管方法是在什麼型別中宣告;args與execution的區別在於,args會在程式執行期間動態的檢查引數的型別,即使是傳入宣告型別的子型別,也可以進行匹配,但是execution則匹配不到該Joinpoint
[email protected]:如果使用@within指定了某型別的註解,那麼只要物件標註了該型別的註解,使用了@within識別符號的@Pointcut就會匹配該物件內部的所有的joinpoint
[email protected]:如果使用@target指定了某型別的註解,那麼只要物件標註了該型別的註解,使用了@target識別符號的@Pointcut就會匹配該物件內部的所有的joinpoint,與@within的不同是:@within屬於靜態的匹配,而@target屬於執行時動態的匹配
[email protected]:使用@args識別符號的Pointcut將會嘗試檢查當前所有的Joinpoint方法引數,如果該次傳入的型別擁有@args所指定的註解,當前Joinpoint將被匹配
[email protected]:使用@annotation識別符號的Pointcut表示式,將會嘗試檢查系統所有物件的所有的方法級別的Joinpoint,若被檢測的方法標註有@annotation識別符號所指定的註解型別,那麼當前方法所在的Joinpoint將被Pointcut表示式所匹配,@annotation的識別符號的應用場景比較廣泛

總而言之,使用步驟分為:自定義註解或者匹配模式,在Aspect中定義@Pointcut(“註解或者是匹配模式”),定義匹配命中後的執行邏輯Advice,並將自定義好的註解運用在業務程式碼的場景中,完成SpringAop的自動代理。

相關推薦

AspectJ形式Pointcut--spring揭祕學習筆記

@AspectJ形式的Pointcut的宣告包含如下兩個部分: Pointcut Expression:其載體為@Pointcut,該註解是方法級別的註解,所以Pointcut Expression不能脫離某個方法單獨宣告,被附著的的方法的名稱是Pointc

Spring揭祕 學習筆記一 (Spring的IoC容器 二)

4.3.5 bean的 scope scope可理解為“作用域”。 scope用來宣告容器中的物件所應該處的限定場景或者說該物件的存活時間,即容器在物件進入其相應的scope之前,生成並裝配這些物件,在該物件不再處於這些scope的限定之後,容器通常會銷燬這

Spring MVC學習筆記

實現 world use 裏的 rate lang 復制 urn bean 一、SpringMVC基礎入門,創建一個HelloWorld程序 1.首先,導入SpringMVC需要的jar包。 2.添加Web.xml配置文件中關於SpringMVC的配置 <

Spring-mvc學習筆記

odin bundle click 客戶端請求 object body axu 匹配 多個 一、SpringMVC基礎入門,創建一個HelloWorld程序 1.首先,導入SpringMVC需要的jar包。 2.添加Web.xml配置文件中關於SpringMVC的配置

我的第一個spring boot程序(spring boot 學習筆記之二)

獲取json 了解 訪問 static 依賴 過程 public 獲取數據 gap 第一個spring boot程序 寫在前面:鑒於spring註解以及springMVC的配置有大量細節和知識點,在學習理解之後,我們將直接進入spring boot的學習,在後續學習中用到註

Spring Boot學習筆記

end 應用程序 maven構建 筆記 項目依賴 新建 輸入 需要 文本 1.不需要任何特殊工具集成,可以使用任何IDE或文本編輯器。 2.Spring Boot CLI是一個命令行工具。 3.使用Maven構建一個基於Spring Boot 的Web應用程序。   1)打

Spring Boot 學習筆記(二)

imp family framework ima pri spa cal bin ges 新建Srping Boot 項目 以下是項目結構 由於Srping Boot內置Tomcat,所以不需要配置Tomcat就可以直接運行。 HelloWorldAppli

Java框架spring Boot學習筆記(八):Spring相關概念

擴展 靜態 輕量級 想要 spring配置 核心 使用 oot 調用方法 Spring是開源、輕量級、一站式框架。 Spring核心主要兩部分 aop:面向切面編程,擴展功能不是修改源代碼實現 ioc:控制反轉,比如一個類,在類裏面有方法(不是靜態的方法),想要調用類

Java框架spring Boot學習筆記(十四):log4j介紹

inf alt 技術分享 images 使用 image 詳細 配置文件 -128 功能 日誌功能,通過log4j可以看到程序運行過程的詳細信息。 使用 導入log4j的jar包 復制log4j的配置文件,復制到src下面         3.設置日誌級別    

Spring Boot學習筆記-配置devtools實現熱部署

原理 enc cnblogs 配置文件 target res 快的 pen cache 寫在前面   Spring為開發者提供了一個名為spring-boot-devtools的模塊來使Spring Boot應用支持熱部署,提高開發者的開發效率,無需手動重啟Spring

spring框架學習筆記4:SpringAOP實現原理

odin 就是 sets 使用 point 攔截 ceo oca ssl AOP AOP(Aspect Oriented Programming),即面向切面編程,可以說是OOP(Object Oriented Programming,面向對象編程)的補充和完善。OOP引入

Spring Cloud學習筆記 【篇一:分布式配置中心 Spring Colud Config】

16px gin war imp web項目 tps conf name request 一、簡介 Spring Cloud Config提供了在分布式系統的外部配置的客戶端支持。通過配置服務(Config Server)來為所有的環境和應用提供外部配置的集中管理。這些概念

Spring 註解學習筆記

list tty ping mode source sse mage 告訴 profile 聲明Bean的註解: @Component : 組件,沒有明確的角色 @Service : 在業務邏輯層(service層)使用 @Repository : 在數據訪問層(

1、spring-boot學習筆記(一)簡單入門

ava project nal run plugin mailto 5.4 安全 class a 一、新建普通Maven工程 pom.xml <parent> <groupId>org.springframework.boot</gr

Spring框架學習筆記(二)

約束 存在 基礎 核心 但是 註解 文件的 分享 strong 上接Spring框架學習筆記(一) IOC和DI區別 (1)IOC: 控制反轉,把對象創建交給spring進行配置 (2)DI: 依賴註入,向類裏面的屬性中設置值 (3)關系:依賴註入不能單獨存在,需要在i

Spring Cloud學習筆記-003

開發 spring pre 學習筆記 bubuko lse 參數 穩定 觸發 Spring Cloud學習筆記-003 服務提供者:向註冊中心註冊服務 1. 新建maven工程,骨架選擇quickstart,工程名稱:demo-member 2. 加入相關依賴

Spring Cloud學習筆記-004

服務 微服務架構 裏的 url 文件 啟動 spa 實現 ron 高可用註冊中心   在微服務架構這樣的分布式環境中,需要充分考慮發生故障的情況,所以在生產環境中必須對各個組件進行高可用部署,對於微服務如此,對於服務註冊中心也一樣。如果一直使用單節點的服務註冊中心

Spring Cloud學習筆記-007

通過 cati tar source 復雜 members quest 項目 ati 聲明式服務調用:Spring Cloud Feign   Feign基於Netflix Feign實現,整合了Spring Cloud Ribbon和Spring Cloud H

Spring Cloud學習筆記-011

設備 配置文件 enable 環境 共享 app 啟用 .config localhost 分布式配置中心:安全保護   由於配置中心存儲的內容比較敏感,做一定的安全處理是必需的。為配置中心實現安全保護的方式有很多,比如物理網絡限制、OAuth2授權等。由於微服務