javascript
Spring-AOP 切点/切面类型和创建切面
- 概述
- 靜態方法匹配器
- 動態方法匹配器
- 六種切點類型
- 靜態方法切點StaticMethodMatcherPointcut
- 動態方法切點DynamicMethodMatcher
- 注解切點AnnotationMatchingPointcut
- 表達式切點ExpressionPointcut
- 流程切點ControlFlowPointcut
- 復合切點ComposablePointcut
- 三種切面類型
- 一般切面Advisor
- 切點切面PointcutAdvisor
- PointcutAdvisor接口實現類
- 引介切面IntroductionAdvisor
- 靜態普通方法名匹配切面
- 靜態正則表達式方法匹配切面
- 動態切面
- 流程切面
- 復合切點切面
- 引介切面
概述
前面的博文介紹增強的時候,我們發現一個問題:增強被織入到了目標類的所有方法中.
如果我們希望有選擇的織入目標類的某些特定方法中呢? ——–這個時候就需要使用切點進行目標連接點的定位。
描述連接點是進行AOP編程最主要的工作,我們來說下Spring AOP如何定位連接點。
增強提供了連接點方位信息,如織入到方法前面、后面等,而切點進一步描述了織入哪些類的哪些方法上
Spring通過org.springframework.aop.Pointcut接口描述切點,Pointcut由ClassFilter和MethodMatcher構成,它
- 通過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
擴展了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 切点/切面类型和创建切面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring-AOP 通过配置文件实现
- 下一篇: Spring-AOP 通过配置文件实现