springboot aop

連接點 JointPoint

表示需要在程序中插入橫切關(guān)注點的擴展點,連接點可能是類初
始化、方法執(zhí)行、方法調(diào)用、字段調(diào)用或處理異常等等,Spring
只支持方法執(zhí)行連接點

切入點 Pointcut

選擇一組相關(guān)連接點的模式,即可以認為連接點的集合,Spring
支持perl5正則表達式和AspectJ切入點模式,Spring默認使用
AspectJ語法

通知 Advice

在連接點上執(zhí)行的行為,通知提供了在AOP中需要在切入點所選
擇的連接點處進行擴展現(xiàn)有行為的手段;在Spring中通過代理模
式實現(xiàn)AOP

方面/切面 Aspect

橫切關(guān)注點的模塊化,比如上邊提到的日志組件??梢哉J為是通知、引入和切入點的組合;在Spring中可以使用Schema和@AspectJ方式進行組織實現(xiàn)。

目標(biāo)對象 Target Object

需要被織入橫切關(guān)注點的對象,即該對象是切入點選擇的對象,需
要被通知的對象,從而也可稱為“被通知對象”;由于Spring
AOP 通過代理模式實現(xiàn),從而這個對象永遠是被代理對象。

AOP代理 AOP Proxy

AOP框架使用代理模式創(chuàng)建的對象,從而實現(xiàn)在連接點處插入通
知(即應(yīng)用切面),就是通過代理來對目標(biāo)對象應(yīng)用切面。在
Spring中,AOP代理可以用JDK動態(tài)代理或CGLIB代理實現(xiàn),而通
過攔截器模型應(yīng)用切面。

織入 Weaving

織入是一個過程,是將切面應(yīng)用到目標(biāo)對象從而創(chuàng)建出AOP代理對象的過程,織入可以在編譯期、類裝載期、運行期進行。

前置通知 Before Advice

在切入點選擇的連接點處的方法之前執(zhí)行的通知,該通知不影響正常程序執(zhí)行流程。

后置通知 After Advice

? 在切入點選擇的連接點處的方法之后執(zhí)行的通知
? 后置返回通知(After returning Advice)
? 后置異常通知(After throwing Advice)
? 后置最終通知(After finally Advice)

環(huán)繞通知 Around Advice

? 環(huán)繞著在切入點選擇的連接點處的方法所執(zhí)行的通知


實例
實例

定義切入點,就是執(zhí)行的條件。切入點的方法不用任何代碼,返回值是void,最重要的是執(zhí)行的條件的表達式。

@Pointcut("execution(* com.test.service.*.*(..))")
    public void executeService()
    {

    }
1)execution:用于匹配子表達式。

            //匹配com.cjm.model包及其子包中所有類中的所有方法,返回類型任意,方法參數(shù)任意
            @Pointcut("execution(* com.cjm.model..*.*(..))")
            public void before(){}

 

      2)within:用于匹配連接點所在的Java類或者包。

            //匹配Person類中的所有方法
            @Pointcut("within(com.cjm.model.Person)")
            public void before(){}

 

            //匹配com.cjm包及其子包中所有類中的所有方法

            @Pointcut("within(com.cjm..*)")
            public void before(){}

 

     3) this:用于向通知方法中傳入代理對象的引用。
            @Before("before() && this(proxy)")
            public void beforeAdvide(JoinPoint point, Object proxy){
                  //處理邏輯
            }

 

      4)target:用于向通知方法中傳入目標(biāo)對象的引用。
            @Before("before() && target(target)
            public void beforeAdvide(JoinPoint point, Object proxy){
                  //處理邏輯
            }

 

      5)args:用于將參數(shù)傳入到通知方法中。
            @Before("before() && args(age,username)")
            public void beforeAdvide(JoinPoint point, int age, String username){
                  //處理邏輯
            }
 
      6)@within :用于匹配在類一級使用了參數(shù)確定的注解的類,其所有方法都將被匹配。 

            @Pointcut("@within(com.cjm.annotation.AdviceAnnotation)") - 所有被@AdviceAnnotation標(biāo)注的類都將匹配
            public void before(){}

  

      7)@target :和@within的功能類似,但必須要指定注解接口的保留策略為RUNTIME。
            @Pointcut("@target(com.cjm.annotation.AdviceAnnotation)")
            public void before(){}

 

      8)@args :傳入連接點的對象對應(yīng)的Java類必須被@args指定的Annotation注解標(biāo)注。
            @Before("@args(com.cjm.annotation.AdviceAnnotation)")
            public void beforeAdvide(JoinPoint point){
                  //處理邏輯
            }

  

      9)@annotation :匹配連接點被它參數(shù)指定的Annotation注解的方法。也就是說,所有被指定注解標(biāo)注的方法都將匹配。
            @Pointcut("@annotation(com.cjm.annotation.AdviceAnnotation)")
            public void before(){}

      10)bean:通過受管Bean的名字來限定連接點所在的Bean。該關(guān)鍵詞是Spring2.5新增的。
            @Pointcut("bean(person)")
            public void before(){}

請注意我們使用了“&&”操作符把execution()和within()指示器連接在一起形成與(and)關(guān)系(切點必須匹配所有的指示器)。類似地,我們可以使用“||”操作符來標(biāo)識或(or)關(guān)系,而使用“!”操
作符來標(biāo)識非(not)操作。
因為“&”在XML中有特殊含義,所以在Spring的XML配置里面描述切點時,我們可以使用and來代替“&&”。同樣,or和not可以分別用來代替“||”和“!”。

通知參數(shù)

任何通知方法可以將第一個參數(shù)定義為org.aspectj.lang.JoinPoint類型(環(huán)繞通知需要定義第一個參數(shù)為ProceedingJoinPoint類型,它是 JoinPoint 的一個子類)。JoinPoint接口提供了一系列有用的方法,比如 getArgs()(返回方法參數(shù))、getThis()(返回代理對象)、getTarget()(返回目標(biāo))、getSignature()(返回正在被通知的方法相關(guān)信息)和 toString()(打印出正在被通知的方法的有用信息)

切入點表達式

定義切入點時需要一個包含名字和任意參數(shù)的簽名,還有一個切入點表達式,就是* findById*(..)這一部分。
  切入點表達式的格式:execution([可見性] 返回類型 [聲明類型].方法名(參數(shù)) [異常])
  其中【】中的為可選,其他的還支持通配符的使用:
  *:匹配所有字符
..:一般用于匹配多個包,多個參數(shù)
+:表示類及其子類
  運算符有:&&、||、!

在使用spring框架配置AOP的時候,不管是通過XML配置文件還是注解的方式都需要定義pointcut”切入點”
例如定義切入點表達式 execution (* com.sample.service.impl..*. *(..))

execution()是最常用的切點函數(shù),其語法如下所示:

整個表達式可以分為五個部分:

1、execution(): 表達式主體。
2、第一個*號:表示返回類型, *號表示所有的類型。
3、包名:表示需要攔截的包名,后面的兩個句點表示當(dāng)前包和當(dāng)前包的所有子包,com.sample.service.impl包、子孫包下所有類的方法。
4、第二個*號:表示類名,*號表示所有的類。
5、*(..):最后這個星號表示方法名,*號表示所有的方法,后面括弧里面表示方法的參數(shù),兩個句點表示任何參數(shù)

相關(guān)博客:
http://www.cnblogs.com/lic309/p/4079194.html
http://blog.csdn.net/lk7688535/article/details/51989746

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容