最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring AOP切點(diǎn)表達(dá)式使用及說(shuō)明

 更新時(shí)間:2024年05月13日 09:15:22   作者:ZerahMu  
這篇文章主要介紹了Spring AOP切點(diǎn)表達(dá)式使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

切點(diǎn)表達(dá)式

在Spring AOP中,連接點(diǎn)始終代表方法的執(zhí)行。切入點(diǎn)是與連接點(diǎn)匹配的謂詞,切入點(diǎn)表達(dá)語(yǔ)言是以編程方式描述切入點(diǎn)的方式。

切點(diǎn)表達(dá)式是除過(guò)AOP邏輯之外我們開(kāi)發(fā)主要關(guān)注的東西,本小結(jié)對(duì)各種表達(dá)式作以說(shuō)明,spring aop中目前有9種切入點(diǎn)表達(dá)式的寫法

  • execute
  • within
  • this
  • target
  • args
  • @target
  • @within
  • @annotation
  • @args

一、execute表達(dá)式

攔截任意公共方法

execution(public * *(..))

攔截以set開(kāi)頭的任意方法

execution(* set*(..))

攔截類或者接口中的方法

攔截AccountService(類、接口)中定義的所有方法
execution(* com.xyz.service.AccountService.*(..))

攔截包中定義的方法,不包含子包中的方法

攔截com.xyz.service包中所有類中任意方法,**不包含**子包中的類
execution(* com.xyz.service.*.*(..))

攔截包或者子包中定義的方法

攔截com.xyz.service包或者子包中定義的所有方法
execution(* com.xyz.service..*.*(..))

二、within表達(dá)式

表達(dá)式格式:包名.* 或者 包名…*

攔截包中任意方法,不包含子包中的方法

攔截service包中任意類的任意方法
within(com.xyz.service.*)

攔截包或者子包中定義的方法

攔截service包及子包中任意類的任意方法
within(com.xyz.service..*)

三、this表達(dá)式

代理對(duì)象為指定的類型會(huì)被攔截

目標(biāo)對(duì)象使用aop之后生成的代理對(duì)象必須是指定的類型才會(huì)被攔截,注意是目標(biāo)對(duì)象被代理之后生成的代理對(duì)象和指定的類型匹配才會(huì)被攔截
this(com.xyz.service.AccountService)

this表達(dá)式的使用,可能不是很好理解,借用示例說(shuō)明一下:

package com.ms.aop.jthis.demo1;
?
public interface IService {
    void m1();
}

package com.ms.aop.jthis.demo1;
?
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
?
@Slf4j
@Component
public class ServiceImpl implements IService {
    @Override
    public void m1() {
        log.info("切入點(diǎn)this測(cè)試!");
    }
}

package com.ms.aop.jthis.demo1;
?
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
@Slf4j
public class Interceptor1 {
?
    @Pointcut("this(com.ms.aop.jthis.demo1.ServiceImpl)")
    public void pointcut() {
    }
?
    @Around("pointcut()")
    public Object invoke(ProceedingJoinPoint invocation) throws Throwable {
        log.info("方法執(zhí)行之前");
        Object result = invocation.proceed();
        log.info("方法執(zhí)行完畢");
        return result;
    }
}

package com.ms.aop.jthis.demo1;
?
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
?
@ComponentScan(basePackageClasses = {Client.class})
@EnableAspectJAutoProxy
@Slf4j
public class Client {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(Client.class);
        IService service = annotationConfigApplicationContext.getBean(IService.class);
        service.m1();
        log.info("{}", service instanceof ServiceImpl);
    }
}

執(zhí)行結(jié)果

10:27:12.277 [main] INFO com.ms.aop.jthis.demo1.ServiceImpl - 切入點(diǎn)this測(cè)試!

10:27:12.277 [main] INFO com.ms.aop.jthis.demo1.Client - false

  • @EnableAspectJAutoProxy:表示若spring創(chuàng)建的對(duì)象如果實(shí)現(xiàn)了接口,默認(rèn)使用jdk動(dòng)態(tài)代理,如果沒(méi)有實(shí)現(xiàn)接口,使用cglib創(chuàng)建代理對(duì)象 所以 service 是使用jdk動(dòng)態(tài)代理生成的對(duì)象,service instanceof ServiceImpl 為 false
  • @Pointcut(“this(com.ms.aop.jthis.demo1.ServiceImpl)”) 表示被spring代理之后生成的對(duì)象必須為com.ms.aop.jthis.demo1.ServiceImpl才會(huì)被攔截,但是service不是ServiceImpl類型的對(duì)象了【這是因?yàn)槟J(rèn)采用的JDK動(dòng)態(tài)代理,所以AOP生成的是代理對(duì)象,因此也service就不是ServiceImpl類型的對(duì)象】,所以不會(huì)被攔截

修改代碼

@EnableAspectJAutoProxy(proxyTargetClass = true)
proxyTargetClass=true表示強(qiáng)制使用cglib來(lái)生成代理對(duì)象

執(zhí)行結(jié)果:

10:34:50.755 [main] INFO com.ms.aop.jthis.demo1.ServiceImpl - 切入點(diǎn)this測(cè)試!

10:34:50.756 [main] INFO com.ms.aop.jthis.demo1.Interceptor1 - 方法執(zhí)行完畢

10:34:50.756 [main] INFO com.ms.aop.jthis.demo1.Client - true

service 為 ServiceImpl類型的對(duì)象,所以會(huì)被攔截,因?yàn)槭煜GLIB理論知識(shí)的同學(xué)都知道,CGLIB生成的代理對(duì)象是源類型的子類,因此service肯定是ServiceImpl類型的對(duì)象了,因?yàn)槎鄳B(tài)屬于關(guān)系。 

四、target表達(dá)式

目標(biāo)對(duì)象為指定的類型被攔截

target(com.xyz.service.AccountService)
目標(biāo)對(duì)象為AccountService類型的會(huì)被代理

this 和 target 的不同點(diǎn)

  • this作用于代理對(duì)象,target作用于目標(biāo)對(duì)象
  • this表示目標(biāo)對(duì)象被代理之后生成的代理對(duì)象和指定的類型匹配會(huì)被攔截,匹配的是代理對(duì)象
  • target表示目標(biāo)對(duì)象和指定的類型匹配會(huì)被攔截,匹配的是目標(biāo)對(duì)象

五、args 表達(dá)式

匹配方法中的參數(shù)

匹配只有一個(gè)參數(shù),且類型為
com.ms.aop.args.demo1.UserModel@Pointcut("args(com.ms.aop.args.demo1.UserModel)")
- 匹配多個(gè)參數(shù)
args(type1,type2,typeN)

匹配任意多個(gè)參數(shù)

匹配第一個(gè)參數(shù)類型為com.ms.aop.args.demo1.UserModel的所有方法, .. 表示任意個(gè)參數(shù)
@Pointcut("args(com.ms.aop.args.demo1.UserModel,..)")

六、@target表達(dá)式

匹配的目標(biāo)對(duì)象的類有一個(gè)指定的注解

目標(biāo)對(duì)象中包含com.ms.aop.jtarget.Annotation1注解,調(diào)用該目標(biāo)對(duì)象的任意方法都會(huì)被攔截
@target(com.ms.aop.jtarget.Annotation1)

七、@within表達(dá)式

指定匹配必須包含某個(gè)注解的類里的所有連接點(diǎn)

聲明有com.ms.aop.jwithin.Annotation1注解的類中的所有方法都會(huì)被攔截
???????@within(com.ms.aop.jwithin.Annotation1)

@target 和 @within 的不同點(diǎn)

  • @target(注解A):判斷被調(diào)用的目標(biāo)對(duì)象中是否聲明了注解A,如果有,會(huì)被攔截
  • @within(注解A): 判斷被調(diào)用的方法所屬的類中是否聲明了注解A,如果有,會(huì)被攔截
  • @target關(guān)注的是被調(diào)用的對(duì)象,@within關(guān)注的是調(diào)用的方法所在的類

八、@annotation表達(dá)式

匹配有指定注解的方法(注解作用在方法上面)

@annotation(com.ms.aop.jannotation.demo2.Annotation1)

被調(diào)用的方法包含指定的注解

九、@args表達(dá)式

方法參數(shù)所屬的類型上有指定的注解,被匹配

注意:是方法參數(shù)所屬的類型上有指定的注解,不是方法參數(shù)中有注解

匹配1個(gè)參數(shù),且第1個(gè)參數(shù)所屬的類中有Anno1注解

  • @args(com.ms.aop.jargs.demo1.Anno1)
  • 匹配多個(gè)參數(shù),且多個(gè)參數(shù)所屬的類型上都有指定的注解
  • @args(com.ms.aop.jargs.demo1.Anno1,com.ms.aop.jargs.demo1.Anno2)
  • 匹配多個(gè)參數(shù),且第一個(gè)參數(shù)所屬的類中有Anno1注解
  • @args(com.ms.aop.jargs.demo2.Anno1,…)

切點(diǎn)表達(dá)式組合

另外,可以使用&&、||、!、三種運(yùn)算符來(lái)組合切點(diǎn)表達(dá)式,表示與或非的關(guān)系。

@Pointcut("@target(org.springframework.stereotype.Repository)")
public void repositoryMethods() {}

@Pointcut("execution(* *..create*(Long,..))")
public void firstLongParamMethods() {}

@Pointcut("repositoryMethods() && firstLongParamMethods()")
public void entityCreationMethods() {}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java導(dǎo)出Excel通用工具類實(shí)例代碼

    Java導(dǎo)出Excel通用工具類實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Java導(dǎo)出Excel通用工具類的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • SpringBoot集成七牛云OSS的示例詳解

    SpringBoot集成七牛云OSS的示例詳解

    OSS的英文全稱是Object?Storage?Service,翻譯成中文就是對(duì)象存儲(chǔ)服務(wù),官方一點(diǎn)解釋就是對(duì)象存儲(chǔ)是一種使用HTTP?API存儲(chǔ)和檢索非結(jié)構(gòu)化數(shù)據(jù)和元數(shù)據(jù)對(duì)象的工具,本文給大家詳細(xì)介紹了SpringBoot集成七牛云OSS的示例,需要的朋友可以參考下
    2023-11-11
  • Java多線程下載文件實(shí)例詳解

    Java多線程下載文件實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了Java多線程下載文件的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 解決mybatis三表連接查詢數(shù)據(jù)重復(fù)的問(wèn)題

    解決mybatis三表連接查詢數(shù)據(jù)重復(fù)的問(wèn)題

    這篇文章主要介紹了解決mybatis三表連接查詢數(shù)據(jù)重復(fù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • SpringCloud中的分布式鎖用法示例詳解(Java+Redis SETNX命令)

    SpringCloud中的分布式鎖用法示例詳解(Java+Redis SETNX命令)

    在Spring Cloud項(xiàng)目中,使用Java和Redis結(jié)合實(shí)現(xiàn)的分布式鎖可以確保訂單的一致性和并發(fā)控制,分布式鎖的使用能夠在多個(gè)實(shí)例同時(shí)提交訂單時(shí),僅有一個(gè)實(shí)例可以成功進(jìn)行操作,本文給大家介紹Spring,Cloud中的分布式鎖用法詳解(Java+Redis SETNX命令),感興趣的朋友一起看看吧
    2023-10-10
  • MyBatis源碼分析之日志記錄詳解

    MyBatis源碼分析之日志記錄詳解

    這篇文章主要給大家介紹了關(guān)于MyBatis源碼分析之日志記錄的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MyBatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Java實(shí)現(xiàn)將一段文字按照句號(hào)和感嘆號(hào)進(jìn)行分割的示例代碼

    Java實(shí)現(xiàn)將一段文字按照句號(hào)和感嘆號(hào)進(jìn)行分割的示例代碼

    這篇文章介紹了一個(gè)用Java實(shí)現(xiàn)的代碼示例,該代碼能夠?qū)⒁欢挝淖职凑站涮?hào)和感嘆號(hào)進(jìn)行分割,并在分割后去除每段的前后空格,使用了正向后行斷言和StringBuilder來(lái)提高效率,需要的朋友可以參考下
    2026-01-01
  • java ArrayBlockingQueue阻塞隊(duì)列的實(shí)現(xiàn)示例

    java ArrayBlockingQueue阻塞隊(duì)列的實(shí)現(xiàn)示例

    ArrayBlockingQueue是一個(gè)基于數(shù)組實(shí)現(xiàn)的阻塞隊(duì)列,本文就來(lái)介紹一下java ArrayBlockingQueue阻塞隊(duì)列的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • maven項(xiàng)目打包如何去掉不需要的module

    maven項(xiàng)目打包如何去掉不需要的module

    文章總結(jié):在my-project工程依賴my-core和my-common,且my-project在總工程AAA中時(shí),建議通過(guò)以下兩種方案優(yōu)化打包流程:1.?使用pom區(qū)分,重新編寫pom文件,并指定需要重新編譯的工程到modules中,然后在編譯時(shí)指定pom文件;
    2024-12-12
  • 如何更優(yōu)雅的關(guān)閉java文本、網(wǎng)絡(luò)等資源

    如何更優(yōu)雅的關(guān)閉java文本、網(wǎng)絡(luò)等資源

    這篇文章主要介紹了如何更優(yōu)雅的關(guān)閉java文本、網(wǎng)絡(luò)等資源,在 finally 的關(guān)閉代碼中,還要再來(lái)一個(gè) try/catch,看著是不是很難受,很不優(yōu)雅,很想干掉這個(gè) finally!,需要的朋友可以參考下
    2019-06-06

最新評(píng)論

岐山县| 怀柔区| 临夏县| 分宜县| 凤凰县| 通道| 青浦区| 稻城县| 章丘市| 中山市| 石泉县| 板桥市| 赣榆县| 琼海市| 瑞丽市| 姚安县| 黔江区| 青州市| 博罗县| 南乐县| 伊春市| 紫云| 贡嘎县| 龙里县| 福鼎市| 宁武县| 广西| 平南县| 双城市| 武山县| 宣恩县| 汉沽区| 永川市| 柘荣县| 博野县| 南昌市| 隆昌县| 鸡泽县| 鹰潭市| 祁阳县| 淅川县|