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

歡迎訪問 生活随笔!

生活随笔

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

javascript

Spring-AOP @AspectJ语法基础

發(fā)布時間:2025/3/21 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring-AOP @AspectJ语法基础 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 概述
  • 切點表達式函數(shù)
    • 方法切點函數(shù)
      • execution()
      • @annotation()
    • 方法入?yún)⑶悬c函數(shù)
      • args()
      • @args()
    • 目標類切點函數(shù)
      • within()
      • target()
      • @within()
      • @target()
    • 代理類切點函數(shù)
      • this
    • 注意事項
  • 在函數(shù)入?yún)⒅惺褂猛ㄅ浞?/li>
    • `*`
    • `..`
    • `+`
  • 邏輯運算符
    • &&
    • ||
  • 不同增強類型
    • @Before
    • @AfterReturning
    • @Around
    • @AfterThrowing
    • @After
    • @DeclareParents
  • 引介增強用法

概述

@AspectJ使用Java5.0注解和正規(guī)的AspectJ的切點表達式語言描述切面, 由于Spring只支持方法的連接點,所以Spring僅支持部分AspectJ的切點語言。

下文闡述的AspectJ切點表達式語言,以AspectJ5.0版本為準。


切點表達式函數(shù)

AspectJ5.0的切點表達式由關鍵字操作參數(shù)組成.

比如 execution(* greetTo(..)) , execution為關鍵字, * greetTo(..) 為操作參數(shù)。

在這里execution代表目標類執(zhí)行某一方法,而 * greetTo(…)描述目標方法的匹配模式串,二者聯(lián)合起來標識目標類greetTo()方法的連接點。 為了方便描述,將execution()稱為函數(shù),而將匹配串 * greetTo(..)稱作函數(shù)的入?yún)ⅰ?/font>

Spring支持9個@AspectJ切點表達式函數(shù),它們用不同的方式描述目標類的連接點
根據(jù)描述對象的不同,大致可以分為4類

  • 方法切點函數(shù):通過描述目標類方法的信息定義連接點

  • 方法入?yún)⑶悬c函數(shù):通過描述目標類方法入?yún)⒌男畔⒍x連接點

  • 目標類切點函數(shù):通過描述目標類類型的信息定義連接點

  • 代理類切點函數(shù):通過描述目標類的代理類的信息定義連接點

下面我們來看下具體的函數(shù)

方法切點函數(shù)

execution()

入?yún)?#xff1a;方法匹配模式串

說明:表示滿足某一匹配模式的所有目標類方法連接點,如 execution(* greetTo(…))表示所有目標類中的greetTo()方法,greetTo()方法可以帶帶任意的入?yún)⒑腿我獾姆祷刂?/p>


@annotation()

入?yún)?#xff1a;方法注解類名

說明:表示標注了某特定注解的目標類方法連接點, 比如@annotation(com.xgj.annotation.NeedTest)表示任何標注了@NeedTest注解的目標類方法。


方法入?yún)⑶悬c函數(shù)

args()

入?yún)?#xff1a;類名

說明:通過判斷目標類方法運行時入?yún)ο蟮念愋投x指定連接點,如args(com.xgj.Waiter)表示所有有且僅有一個按類型匹配于Waiter入?yún)⒌姆椒ā?/p>


@args()

入?yún)?#xff1a;類型注解類型

說明:通過判斷目標類方法運行時入?yún)ο蟮念愂欠駱俗⒘颂囟ǖ淖⒔庵付ㄟB接點。 比如@args(com.xgj.Monitor)表示任何這樣的一個目標方法,它有一個入?yún)⑶胰雲(yún)ο蟮念悩俗?#64;Monitor注解


目標類切點函數(shù)

within()

入?yún)?#xff1a;類名匹配串

說明:表示特定域下的所有連接點,比如 within(com.xgj.service.*)表示com.xgj.service包中所有的連接點,即包中所有類的所有方法; 而 within(com.xgj.service.*Service)表示在com.xgj.service包中所有以Service結尾的類的所有連接點


target()

入?yún)?#xff1a;類名

說明:假如目標類按類型匹配與指定類,則目標類的所有連接點匹配這個切點。 比如通過target(com.xgj.Waiter)定義的切點,Waiter及Waiter實現(xiàn)類NaiveWaiter中的所有連接點都匹配該切點


@within()

入?yún)?#xff1a;類型注解類名

說明:假如目標類按類型匹配于某個類A,且類A標注了特定的注解,這目標類的所有連接點匹配這個切點。 比如@within(com.xgj.Monitor)定義的切點,加入Waiter實現(xiàn)了@Monitor注解,這Waiter及Waiter的實現(xiàn)類NaiveWaiter的說喲連接點都匹配這個切點


@target()

入?yún)?#xff1a;類型注解類名

說明:假如目標類標注了特定注解,則目標類的所有連接點都匹配該切點。 如@target(com.xgj.Monitor),假設NaiveWaiter標注了@Monitor注解,則NaiveWaiter的所有連接點都匹配這個切點


代理類切點函數(shù)

this

入?yún)?#xff1a;類名

說明:代理類按類型匹配于指定類,則被代理的目標類的所有連接點都匹配該切點。

注意事項

除了上述的函數(shù)外,@AspectJ還有其它的函數(shù) ,比如call()、initialization()等,但是不能夠在Spring中使用,否則會拋出IllegalArgumentException異常。


在函數(shù)入?yún)⒅惺褂猛ㄅ浞?/h1>

有些函數(shù)的入?yún)⒖梢越邮芡ㄅ浞?#xff0c;@AspectJ支持三種通配符

*

* 表示匹配任意字符,但它只能匹配上下文中的一個元素


..

..表示匹配任意字符,可以匹配上下文中的 多個元素, 但在標識類時,必須和 * 聯(lián)合使用,而在表示入?yún)r則單獨使用


+

+表示按照類型匹配指定類的所有類,必須跟在類名后面,比如com.xgj.Service+。 繼承或擴展指定類的所有類,同時還包含指定類本身。

##支持通配符的函數(shù)說明

  • 支持所有通配符 execution()和within() , 比如within(com.xgj.*) within(com.xgj.service..*.*Service+)

  • 僅支持“+”通配符: args()、this()和target(). 比如args(com.xgj.Waiter+) 、target(java.util.List+)等。 雖然支持+通配符,但是意義不大。 對于這些函數(shù)來講使用+和不使用+是等價的

  • 不支持通配符: @args()、@within、@target 和 @annotation.

此外,args() this() target() @args() @within() @target() @annotation() 這7個函數(shù)除了可以指定類名外,也可以指定變量名,并將目標對象中的變量綁定到增強的方法中。


邏輯運算符

切點表達式由切點函數(shù)組成,切點函數(shù)之間可以進行邏輯運算,組成復合切點。

Spring支持以下切點運算符

&&

與操作符,相當于切點的交集運算。

如果在Spring的XML配置文件中使用切點表達式,由于&是XML特殊字符,所以使用轉義字符串&&表示。

為了方便,Spring提供了一個等效的運算符and, 比如within(com.xgj..*) and args(String) 表示在com.xgj包下所有類(當前包以及子孫包)擁有一個String入?yún)⒌姆椒?#xff1b;


||

或操作符,相當于切點的并集運算,or是等效的操作符。如within(com.xgj..*) || args(String) 表示在com.xgj包下的所有類的方法,或者所有擁有一個String入?yún)⒌姆椒?#xff1b;


非操作符,相當于切點的反集運算,not是等效的操作符。如!within(com.xgj.*) 表示所有不在com.xgj包下的方法。

注意:

在Spring中使用and or 和 not操作符時,允許不在前面添加空格,比如within(com.xgj..*)andnotargs(String) 和 within(com.xgj..*) and not args(String)是等效的,不過為了程序的可讀性,我們還是要求在操作符的前后添加空格。

另外,如果not位于切點表達式的開頭,則必須在開頭添加一個空格,否則會產生解析錯誤。 比如 not within(com.xgj..*)


不同增強類型

@AspectJ為各種的增強類型提供了不同的注解類,它們位于org.aspectj.lang.annotation.*包中,這些注解類擁有若干個成員,可以通過這些成員完成定義切點信息、綁定連接點參數(shù)等操作;

此外,這些注解的存留期限都是RetentionPolicy.RUNTIME,標注目標都是ElementType.METHOD。


@Before

前置增強,相當于BeforeAdvice的功能,

Before注解類擁有兩個成員:

  • value:該成員用于定義切點;

  • argNames:由于無法通過Java反射機制獲取方法入?yún)⒚?#xff0c;所有如果在Java編譯時未啟動調試信息或者需要在運行期解析切點,就必須通過這個成員指定注解所標注增強方法的參數(shù)名(注意兩者名字必須完全相同),多個參數(shù)名用逗號分隔。


@AfterReturning

后置增強,相當于AfterReturningAdvice,

AfterReturning注解類擁有4個成員:

  • value:該成員用于定義切點;

  • pointcut:表示切點的信息,如果顯式指定pointcut值,它將覆蓋value的設置值,可以將pointcut成員看成是value的同義詞;

  • returning:將目標對象方法的返回值綁定給增強的方法;

  • argNames:如前所述。


@Around

環(huán)繞增強,相當于MethodInterceptor,

Around注解類擁有兩個成員:

  • value:該成員用于定義切點;

  • argNames:如前所述。

@Aspect public class AtTargetAspect {@Around("@target(com.xgj.aop.spring.advisor.aspectJ.function.attarget.Mark)")public void crossCuttingCode(ProceedingJoinPoint joinPoint)throws Throwable {System.out.println("****AtTargetAspect.crossCuttingCode() : "+ joinPoint.getSignature().getName()+ ": Before Method Execution");try {joinPoint.proceed();} finally {// Do Something useful, If you have}System.out.println("****AtTargetAspect.crossCuttingCode() : "+ joinPoint.getSignature().getName()+ ": After Method Execution");} }

@AfterThrowing

拋出增強,相當于ThrowsAdvice.

AfterThrowing注解類擁有4個成員:

  • value:該成員用于定義切點;

  • pointcut:表示切點的信息,如果顯式指定pointcut值,它將覆蓋value的設置值,可以將pointcut成員看成是value的同義詞;

  • throwing:將拋出的異常綁定到增強方法中;

  • argNames:如前所述。


@After

Final增強,不管是拋出異常或者是正常退出,該增強都會得到執(zhí)行,該增強沒有對應的增強接口,可以把它看成是ThrowsAdvice和AfterReturningAdvice的混合物,一般用于釋放資源,相當于try{}finally{}的控制流。

After注解類擁有兩個成員:

  • value:該成員用于定義切點;

  • argNames:如前所述。


@DeclareParents

引介增強,相當于IntroductionInterceptor,

DeclareParents注解類擁有兩個成員:

  • value:該成員用于定義切點,它表示在哪個目標類上添加引介增強;

  • defaultImpl:默認的接口實現(xiàn)類。


引介增強用法

代碼已托管到Github—> https://github.com/yangshangwei/SpringMaster

假設我們希望Waiter能夠同時充當Seller的角色,即通過切面技術為NaiveWaiter新增Seller接口的實現(xiàn)。

下面我們使用@AspectJ的引介增強來實現(xiàn)這一個功能。

package com.xgj.aop.spring.advisor.aspectJ.basic;import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.DeclareParents;/*** * * @ClassName: EnableSellerAspect* * @Description: 希望Waiter也能同時充當Seller的角色* * @author: Mr.Yang* * @date: 2017年8月26日 上午1:23:41*/@Aspect public class EnableSellerAspect {// (1)value 為NaiveWaiter添加接口實現(xiàn), (2)defaultImpl默認的接口實現(xiàn)類@DeclareParents(value = "com.xgj.aop.spring.advisor.aspectJ.basic.NaiveWaiter", defaultImpl = SmartSeller.class)public Seller seller; // (3) 要實現(xiàn)的目標接口 }

分析:

在EnableSellerAspect 切面中,通過@DeclareParents為NaiveWaiter添加了一個需要實現(xiàn)的Seller接口,并指定其默認實現(xiàn)類為SmartSeller. 然后通過切面技術將SmartSeller融合到NaiveWaiter中,這樣NaiveWaiter就實現(xiàn)了Seller接口。

配置文件,配置切面和NaiveWaiter Bean

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 使用基于Schema的aop命名空間進行配置 --><!-- 基于@AspectJ切面的驅動器 --> <aop:aspectj-autoproxy/><!-- 目標Bean --> <bean id="waiter" class="com.xgj.aop.spring.advisor.aspectJ.basic.NaiveWaiter"/> <!-- 使用了@AspectJ注解的切面類 --> <bean class="com.xgj.aop.spring.advisor.aspectJ.basic.EnableSellerAspect"/></beans>

測試類:

package com.xgj.aop.spring.advisor.aspectJ.basic;import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class EnableSellerAspectTest {@Testpublic void test() {ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/xgj/aop/spring/advisor/aspectJ/basic/conf-aspectJ.xml");Waiter waiter = ctx.getBean("waiter", Waiter.class);waiter.greetTo("XiaoGongJiang");// 可以成功的進行強制類型轉換Seller seller = (Seller) waiter;seller.sell("beer", "XiaoGongJiang");} }

運行結果:

2017-08-26 01:42:50,077 INFO [main] (AbstractApplicationContext.java:583) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@24b9371e: startup date [Sat Aug 26 01:42:50 BOT 2017]; root of context hierarchy 2017-08-26 01:42:50,173 INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/aop/spring/advisor/aspectJ/basic/conf-aspectJ.xml] NaiveWaiter Greet to XiaoGongJiang SmartSeller: sell beer to XiaoGongJiang

可見,NaiveWaiter已經(jīng)成功的新增了Seller接口的實現(xiàn)。

《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Spring-AOP @AspectJ语法基础的全部內容,希望文章能夠幫你解決所遇到的問題。

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