@Pointcut 使用

简介: @Pointcut 使用

作用

抽取通用逻辑。

使用

1) 定义切入点;
2) 选择合适的切入方法。

范例(源自参考文章):注意代码中的注释

    //@1:这个类需要使用@Aspect进行标注
    @Aspect
    public class Aspect1 {
   

        //@2:定义了一个切入点,可以匹配Service1中所有方法
        @Pointcut("execution(* com.javacode2018.aop.demo9.test1.Service1.*(..))")
        public void pointcut1() {
   
        }

        //@3:定义了一个前置通知,这个通知对刚刚上面我们定义的切入点中的所有方法有效
        @Before(value = "pointcut1()")
        public void before(JoinPoint joinPoint) {
   
            //输出连接点的信息
            System.out.println("前置通知," + joinPoint);
        }

        //@4:定义了一个异常通知,这个通知对刚刚上面我们定义的切入点中的所有方法有效
        @AfterThrowing(value = "pointcut1()", throwing = "e")
        public void afterThrowing(JoinPoint joinPoint, Exception e) {
   
            //发生异常之后输出异常信息
            System.out.println(joinPoint + ",发生异常:" + e.getMessage());
        }

    }

定义切入点

切入点,即能通过@PointCut中的模式字符串匹配到的方法。模式字符串有多种写法,可以分为类使用、方法使用、实例使用三类:

方法使用:

execution:用于匹配方法执行的连接点
args:用于匹配当前执行的方法传入的参数为指定类型的执行方法
@args:用于匹配当前执行的方法传入的参数是指定类型的
@annotation:用于匹配当前执行方法持有指定注解的方法
切点引入,在切点定义类中对应方法上定义@PointCut,然后在@Aspect类中使用完整方法路径()引用,以分离切点定义和使用,方便切点集中管理

类使用:

within:用于匹配指定类内的方法执行
this:用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配
target:用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配
@within:用于匹配所以持有指定注解的类型内的方法
@target:用于配当前目标对象类型的执行方法,其中目标对象持有指定的注解

对象使用:

bean:Spring AOP扩展的,AspectJ没有对于指示符,用于匹配特定名称的Bean对象的执行方法

选择合适的切入方法

@Before:方法执行前执行
@Around:方法执行前后执行
@After:在连接点方法完成之后执行,无论连接点方法执行成功还是出现异常,都将执行后置方法
@AfterRunning:在方法成功执行返回结果之后执行
@AfterThrowing:在方法抛错之后执行

参考文章:
https://cloud.tencent.com/developer/article/1655923
https://blog.csdn.net/u010502101/article/details/78823056

目录
相关文章
|
JSON Java API
GSON 泛型对象反序列化解决方案
GSON 泛型对象反序列化解决方案
579 0
|
存储 开发框架 安全
如何平滑将注册中心从Eureka迁移到Nacos?
Nacos与Eureka相比,Nacos的优点非常明显,当然首选Nacos作为注册中心。本文主要介绍如何从Eureka无缝平滑迁移到Nacos注册中心,业务方应用改动最小,业务应用改造一次完成迁移。
1498 0
如何平滑将注册中心从Eureka迁移到Nacos?
|
8月前
|
人工智能 自然语言处理 语音技术
FilmAgent:多智能体共同协作制作电影,哈工大联合清华推出 AI 驱动的自动化电影制作工具
FilmAgent 是由哈工大与清华联合推出的AI电影自动化制作工具,通过多智能体协作实现从剧本生成到虚拟拍摄的全流程自动化。
2498 13
FilmAgent:多智能体共同协作制作电影,哈工大联合清华推出 AI 驱动的自动化电影制作工具
|
11月前
|
数据安全/隐私保护 Docker 容器
docker swarm创建网络
【10月更文挑战第15天】
130 1
解决Java中的EOFException异常的方法
解决Java中的EOFException异常的方法
条件变量函数pthread_cond_timedwait实现业务场景
条件变量函数pthread_cond_timedwait实现业务场景
357 0
|
人工智能 数据挖掘 大数据
爆赞!GitHub首本标星120K的Python程序设计人工智能案例手册
为什么要学习Python? Python简单易学,且提供了丰富的第三方库,可以用较少的代码完成较多的工作,使开发者能够专注于如何解决问题而只花较少的时间去考虑如何编程。此外,Python还具有免费开源、跨平台、面向对象、胶水语言等优点,在系统编程、图形界面开发、科学计算、Web开发、数据分析、人工智能等方面有广泛应用。尤其是在数据分析和人工智能方面,Python已成为最受开发者欢迎的编程语言之一,不仅大量计算机专业人员选择使用Python进行快速开发,许多非计算机专业人员也纷纷选择Python语言来解决专业问题。 由于Python应用广泛,关于Python的参考书目前已经有很多,但将Pytho
|
Java 开发者 Spring
springboot @RequiredArgsConstructor @Lazy解决循环依赖的原理
【5月更文挑战第16天】在Spring Boot中,@RequiredArgsConstructor 和 @Lazy 是两个有用的注解,它们分别用于简化构造函数的生成和控制Bean的加载时间。下面详细解析这两个注解的概念、优缺点以及在实际应用中的示例。
1648 1
|
容器
【cocos 2d微信小游戏开发教程】基础使用笔记分享(二)
【cocos 2d微信小游戏开发教程】基础使用笔记分享(二)
325 0
|
运维 OLAP 测试技术
Doris是否可以替代influxdb
【4月更文挑战第20天】Doris是否可以替代influxdb
706 0