当前位置: 首页 > news >正文

@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

相关文章:

  • springboot访问静态页面,并加载css、js样式
  • 35【源码】数据可视化:基于 Echarts + Python 动态实时大屏 - 门店销售业绩数据中心
  • 如何给《羊了个羊》配置一套智能客服系统?
  • CSS的背景——颜色,图片,背景图片位置,
  • 内网渗透之CFS三层靶机搭建
  • Mediacodec 如何硬件解码到纹理的
  • PDF格式分析(七十五)——线型注释(Line)
  • 医学视VQA——综述
  • Lambda表达式实现方式、标准格式、练习、省略模式、注意事项及和匿名内部类的区别
  • java毕业生设计医患辅助系统计算机源码+系统+mysql+调试部署+lw
  • CAD如何绘制六连环图案?CAD使用圆,椭圆,直线综合练习
  • 二叉树及其应用(增删改查)
  • 分库分表二:ShardingJDBC进阶实战案例上
  • ClickHouse(06)ClickHouse的数据表创建语句详细解析
  • 银纳米团簇-荧光Ag25团簇以及衍生团簇(直径1-2nm)
  • 网络传输文件的问题
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • css系列之关于字体的事
  • es6要点
  • Redash本地开发环境搭建
  • Redis学习笔记 - pipline(流水线、管道)
  • vue-router的history模式发布配置
  • 翻译:Hystrix - How To Use
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 小程序 setData 学问多
  • 阿里云服务器购买完整流程
  • 组复制官方翻译九、Group Replication Technical Details
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (zhuan) 一些RL的文献(及笔记)
  • (八)Flask之app.route装饰器函数的参数
  • (二)Linux——Linux常用指令
  • (九十四)函数和二维数组
  • (六)c52学习之旅-独立按键
  • (四)汇编语言——简单程序
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .net mvc部分视图
  • .NET 使用配置文件
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .NET下的多线程编程—1-线程机制概述
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @Import注解详解
  • @JSONField或@JsonProperty注解使用
  • [CTF]2022美团CTF WEB WP
  • [Fri 26 Jun 2015 ~ Thu 2 Jul 2015] Deep Learning in arxiv
  • [LeetCode]Balanced Binary Tree
  • [lesson17]对象的构造(上)
  • [NSSRound#16 Basic]RCE但是没有完全RCE
  • [one_demo_12]递归打印*\n*.*.\n*..*..\n图形
  • [one_demo_13]ArrayList去除重复的元素