日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring-AOP 切点/切面类型和创建切面

發布時間:2025/3/21 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring-AOP 切点/切面类型和创建切面 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  • 概述
    • 靜態方法匹配器
    • 動態方法匹配器
  • 六種切點類型
    • 靜態方法切點StaticMethodMatcherPointcut
    • 動態方法切點DynamicMethodMatcher
    • 注解切點AnnotationMatchingPointcut
    • 表達式切點ExpressionPointcut
    • 流程切點ControlFlowPointcut
    • 復合切點ComposablePointcut
  • 三種切面類型
      • 一般切面Advisor
      • 切點切面PointcutAdvisor
        • PointcutAdvisor接口實現類
      • 引介切面IntroductionAdvisor
  • 靜態普通方法名匹配切面
  • 靜態正則表達式方法匹配切面
  • 動態切面
  • 流程切面
  • 復合切點切面
  • 引介切面

概述

前面的博文介紹增強的時候,我們發現一個問題:增強被織入到了目標類的所有方法中.

如果我們希望有選擇的織入目標類的某些特定方法中呢? ——–這個時候就需要使用切點進行目標連接點的定位

描述連接點是進行AOP編程最主要的工作,我們來說下Spring AOP如何定位連接點。

增強提供了連接點方位信息,如織入到方法前面、后面等,而切點進一步描述了織入哪些類的哪些方法上

Spring通過org.springframework.aop.Pointcut接口描述切點,Pointcut由ClassFilterMethodMatcher構成,它

  • 通過ClassFilter定位到某個特定的類上,
  • 通過MethodMatcher定位到某些特定方法上。

這樣Pointcut就擁有了某些類的某些特定方法的能力。

ClassFilter中定義了唯一的方法

boolean matches(Class<?> clazz);

入參為一個被檢測的類,該方法判斷被檢測的類是否匹配過濾條件。


Spring支持兩種方法匹配器

靜態方法匹配器

所謂靜態方法匹配器,僅對方法名簽名(包括方法名和入參類型及順序)進行匹配。


動態方法匹配器

動態方法匹配器會在運行期方法檢查入參的值。 靜態匹配僅會判斷一次,而動態匹配因為每次調用方法的入參可能不一樣,所以每次調用方法都必須判斷。

因此,動態匹配對性能的影響很大,一般情況下,動態匹配器不常用。 方法匹配器的類型由MethodMatcher接口的isRuntime方法的返回值決定, 返回false標識靜態方法匹配器,true標識位動態方法匹配器。


六種切點類型

靜態方法切點StaticMethodMatcherPointcut

org.springframework.aop.support.StaticMethodMatcherPointcut是靜態方法切點的抽象基類,默認情況下匹配所有的類

最常用的兩個子類如上所示,分別是 NameMatchMethodPointcut 和 AbstractRegexpMethodPointcut , 前者提供簡單字符串匹配方法簽名,后者使用正則表達式匹配方法簽名。


動態方法切點DynamicMethodMatcher

org.springframework.aop.support.DynamicMethodMatcher是動態方法切點的抽象基類,默認情況下匹配所有的類


注解切點AnnotationMatchingPointcut

org.springframework.aop.support.annotation.AnnotationMatchingPointcut實現類標識注解切點。 使用AnnotationMatchingPointcut支持在Bean中直接通過Java5.0注解標簽定義切點


表達式切點ExpressionPointcut

org.springframework.aop.support.ExpressionPointcut接口主要是為了支持AspectJ切點表達式語法而定義的接口


流程切點ControlFlowPointcut

org.springframework.aop.support.ControlFlowPointcut實現類標識控制流程切點。 ControlFlowPointcut是一種特殊的切點,它根據程序執行堆棧的信息查看目標方法是否由某一個方法直接或間接發起調用,以此判斷是否為匹配的連接點。


復合切點ComposablePointcut

org.springframework.aop.support.ComposablePointcut實現類是為了創建多個切點而提供的方便操作類。 它所有的方法都返回ComposablePointcut類,這樣就可以使用鏈接表達式對切點進行操作,形如

Pointcut pc = new ComposalbePointcut().union(classFilter).intersection(methodMatcher).intersection(pointcut);


三種切面類型

由于增強包括橫切代碼,又包含部分連接點信息(方法前、方法后主方位信息),所以可以僅通過增強類生成一個切面。 但切點僅僅代表目標類連接點的部分信息(類和方法的定位),所以僅有切點無法制作出一個切面,必須結合增強才能制作出切面。

Spring使用org.springframework.aop.Advisor接口標識切面概念,一個切面同時包含橫切代碼和連接點信息。

切面可以分為3類:一般切面、切點切面、引介切面

我們來看下切面繼承關系

一般切面Advisor

org.springframework.aop.Advisor代表一般切面,僅包含一個Advice

因為Advice包含了橫切代碼和連接點信息,所以Advice本身一個簡單的切面,只不過它代表的橫切的連接點是所有目標類的所有方法,因為這個橫切面太寬泛,所以一般不會直接使用。


切點切面PointcutAdvisor

org.springframework.aop.PointcutAdvisor ,代表具有切點的切面,包括Advice和Pointcut兩個類,這樣就可以通過類、方法名以及方位等信息靈活的定義切面的連接點,提供更具實用性的切面。

PointcutAdvisor接口實現類

PointcutAdvisor主要有6個具體的實現類:

  • DefaultPointcutAdvisor

    最常用的切面類型,它可以通過任意Pointcut和Advice定義一個切面,唯一不支持的就是引介的切面類型,一般可以通過擴展該類實現自定義的切面

  • NameMatchMethodPointcutAdvisor

    通過該類可以定義按方法名定義切點的切面

  • RegexpMethodPointcutAdvisor

    對于按照正則表達式匹配的方法名進行切點定義的切面,可以擴展該實現類進行操作。

  • AspectJExpressionPointcutAdvisor

    用于AspectJ切點表達式定義切點的切面

  • StaticMethodMatcherPointcutAdvisor

    靜態方法匹配器切點定義的切面,默認情況下匹配所有的的目標類。

  • AspectJPointcutAdvisor

    用于AspectJ語法定義切點的切面

    這些Advisor的實現類都可以在Pointcut中找到對應物,實際上,他們都是通過擴展對應的Pintcut實現類并實現PointcutAdvisor接口進行定義的。

    比如StaticMethodMatcherPointcutAdvisor

public abstract class StaticMethodMatcherPointcutAdvisor extends StaticMethodMatcherPointcutimplements PointcutAdvisor, Ordered, Serializable

擴展了StaticMethodMatcherPointcut類并實現了PointcutAdvisor接口。

此外Advisor都實現了org.springframework.core.Ordered接口,Spring將根據Advisor定義的順序決定織入切面的順序


引介切面IntroductionAdvisor

org.springframework.aop.IntroductionAdvisor代表引介切面, 引介切面是對應引介增強的特殊的切面,它應用于類層上面,所以引介切點使用ClassFilter進行定義。


靜態普通方法名匹配切面

詳情見另外一篇博文 Spring-AOP 靜態普通方法名匹配切面


靜態正則表達式方法匹配切面

詳情見另外一篇博文 Spring-AOP 靜態正則表達式方法匹配切面


動態切面

詳情見另外一篇博文 Spring-AOP 動態切面


流程切面

詳情見另外一篇博文 Spring-AOP 流程切面


復合切點切面

詳情見另外一篇博文 Spring-AOP 復合切點切面


引介切面

詳情見另外一篇博文 Spring-AOP 引介切面

總結

以上是生活随笔為你收集整理的Spring-AOP 切点/切面类型和创建切面的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。