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

aspectj:AOP编程备忘录-切面定义的注意事项

AOP编程时定义切面时需要注意的事

@Around

@Around注解拦截构造方法(Constructor)时切面定义只能用call方式而不能是execution,否则 ProceedingJoinPoint.proceed()返回的是null,得不到构造的实例。

execution

execution切入点要修改对象内部,所以PCW模式下如果对第三方库定义切面,不建议使用这种方式,要改为call.
因为PCW如果要以execution方式切入,就会在当前项目的 target/classes下(maven环境)重新生成第三方库的class.把原本简单的事搞复杂了。

call

在使用AspectJ进行AOP编程时,AspectJ不能对没有公开构造方法的类或对静态方法进行调用(call)操作。AspectJ的切面(aspect)中的切点(pointcut)用来指定对哪些类或方法进行拦截,但如果目标对象没有公开的构造方法,AspectJ将无法创建该类的代理对象,从而无法完成AOP操作。

在这里插入图片描述

解决方法:

确保目标类有一个或多个公开的构造方法。如果是第三方库中的类,可能需要查看文档或源代码来确定是否可以修改。

如果是静态方法,可以考虑使用非静态方法,并通过单例模式(Singleton pattern)来保证全局唯一性,或者使用AspectJ提供的额外方法(如@Pointcut(“execution(static * .(…))”)来处理静态方法。

如果不希望修改原始类,可以考虑使用AspectJ提供的Percflow或Percflowbelow切点指定器,但这通常需要更复杂的表达式和特定的环境配置。

如果是编译时期错误,可以检查AspectJ的编译和加载配置是否正确。

请根据具体情况选择合适的解决方法。

参考资料

《AspectJ: intercept constructor when method reference is used》
《AspectJ pointcut on constructor object》

http://www.lryc.cn/news/383646.html

相关文章:

  • 大数据面试题之Hive(1)
  • 【Git】分布式版本控制工具
  • 排序之插入排序----直接插入排序和希尔排序(1)
  • 快速创建条形热力图
  • go switch 与 interface
  • BaseMapper 接口介绍
  • HAL-Cubemax定时器使用记录
  • 同时使用磁吸充电器和Lightning时,iPhone充电速度会变快吗?
  • 零成本搭建个人图床服务器
  • SpringBoot 搭建sftp服务 实现远程上传和下载文件
  • IDEA中使用leetcode 刷题
  • 华为海思CPU解读
  • 中介子方程三十三
  • 今年哪两个行业可能有贝塔?
  • 嵌入式软件开发工具使用介绍
  • 【TB作品】MSP430G2553,单片机,口袋板, 交通灯控制系统
  • windows 安装 Kubernetes(k8s)
  • C语言 | Leetcode C语言题解之第189题轮转数组
  • 【安全审核】音视频审核开通以及计费相关
  • 【实战】Spring Cloud Stream 3.1+整合Kafka
  • java之可变字符串之append方法
  • [保姆级教程]uniapp自定义导航栏
  • 项目训练营第二天
  • 考研数学一有多难?130+背后的残酷真相
  • vue2脚手架笔记总结1
  • 校园巡礼:一周只上四天课,入学即发钱?深圳理工大学,开局即王炸
  • 免交互 实验
  • Sublime Text 设置
  • spire.Pdf 将pdf转成image
  • 仓颉编程语言 -- 初识(一)