日韩性视频-久久久蜜桃-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)站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av福利网 | 中文字幕乱码av | 在线国产区 | 深夜精品视频 | 伊人网五月天 | 极品美女高潮 | 在线观看免费中文字幕 | 婷婷伊人五月天 | 日日夜夜艹 | 伊人免费视频 | 黄色精品视频 | 国产麻豆剧传媒精品国产av | 免费一二三区 | 69精品人妻一区二区三区 | 国产乱人| 精品久久久99 | 欧美日韩a| 中文在线日本 | 日本免费网站在线观看 | 日韩国产欧美 | 欧美黄页在线观看 | 国产黄色免费网站 | 日韩有码在线播放 | 久久国产精品系列 | 日韩va亚洲va欧美va久久 | 香蕉久久久 | 中文在线第一页 | 熟女av一区二区三区 | 99re伊人| av在线播放一区二区三区 | 免费无遮挡在线观看视频网站 | 亚洲精品午夜国产va久久成人 | 亚洲美女激情视频 | 99re6这里只有精品 | 性欧美4khd高清极品 | 欧美激情免费视频 | 欧洲人妻丰满av无码久久不卡 | 精品欧美 | 国产欧美精品在线 | 亚洲av成人无码一二三在线观看 | 99久久毛片 | 91黑丝美女 | 天天色综合天天 | 在线免费黄网 | 免费av在线播放网址 | 91免费成人 | 打屁股无遮挡网站 | 韩日一级片| 视频一区二区不卡 | 欧美性生交xxxxx久久久 | av一二三四 | 亚洲视频网站在线观看 | 91精品国产91久久久久久久久久久久 | 中文字幕免费观看视频 | japanese24hdxxxx日韩| 欧美一本 | 综合中文字幕 | www.九色| 国产视频精品视频 | 亚洲av综合色区 | 久草最新 | 成人欧美一区二区三区黑人 | 国产一区二区三区黄 | 人妻丰满熟妇无码区免费 | 草草影院最新 | 亚洲欧美日韩国产一区二区 | 国产精品久久久免费观看 | 国产欧美一区二区 | 欧美在线导航 | 色欲AV无码精品一区二区久久 | 黑人玩弄人妻一区二区三区 | 日本人妖网站 | 久久91av| 丰满肥臀噗嗤啊x99av | 九九爱精品 | 日老女人视频 | 天堂最新资源在线 | 亚洲天堂网在线观看视频 | 草莓视频在线观看入口w | 国产一级二级三级精品 | 精品视频在线观看 | 国产无遮挡免费观看视频网站 | 亚洲人成网站999久久久综合 | 一区二区三区四区不卡 | 色婷婷av一区二区三区在线观看 | 姝姝窝人体www聚色窝 | 91日本在线观看 | 好吊色青青草 | 日韩第一页在线 | 午夜激情男女 | 中文理论片| 黑人操亚洲人 | 久草国产精品 | 在线一区二区三区视频 | 亚洲熟妇无码爱v在线观看 九色福利 | 色www情 | av激情久久| 精品成人中文无码专区 | 成人黄色免费视频 |