AOP 您所在的位置:网站首页 @aspect注解与@pointcut AOP

AOP

2023-01-21 05:42| 来源: 网络整理| 查看: 265

起因

自己定义了一个切面注解,及处理方法,将他打包封装后供外部调用。

依赖jar包 aspectjweaver 版本 1.8.9

具体代码如下:

/** * 统计一个方法耗时注解 */ @Documented @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface TimeCost { } /** * 计算耗时注解的实际计算过程方法 */ @Aspect @Component @Order(10) public class CostTimeAspect { private Logger logger = LoggerFactory.getLogger(CostTimeAspect.class); @Pointcut(value = "@annotation(com.yuxuntoo.www.common.annotations.TimeCost)") public void costTime(){ } @Around("runTime()") public Object costTimeAround(ProceedingJoinPoint joinPoint) { } } 问题

Caused by: java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut runTime

这个错误着实让我头疼了一上午,没有找到解决思路。这个错误是和我们的aop切面有关系,从这个方位入手,查找是否引错了包信息或者导错包?

经过一番排查都没有错误。

解决方法

后来经过排查,发现是自己的写法有问题,在@Around的参数中我们使用的是runtime(),这里是有问题的!

@Around: 环绕增强,相当于MethodInterceptor.

这里Around的value参数应该写的是上面的签名,而不是runTime,如果@Around 参数值里 “@annotation (timeCost)" 是为了匹配 costTimeAround 方法的入参 timeCost,名称要相同。

@Around("costTime()") public Object costTimeAround(ProceedingJoinPoint joinPoint,TimeCost timeCost) { }

这样调整一下在启动就不会出现上面问题中的错误了!

知识拓展

Aop的一些常用基本概念

Advice(通知、切面): 某个连接点所采用的处理逻辑,也就是向连接点注入的代码, AOP在特定的切入点上执行的增强处理。

@Before: 标识一个前置增强方法,相当于BeforeAdvice的功能.@Around: 环绕增强,相当于MethodInterceptor.@After: final增强,不管是抛出异常或者正常退出都会执行.@AfterReturning:  后置增强,似于AfterReturningAdvice, 方法正常退出时执行.@AfterThrowing:  异常抛出增强,相当于ThrowsAdvice.

以上这些基础的概念有助于我们更好的理解什么是面向切面编程O(∩_∩)O哈哈~。

好了,今天的问题先到这里,感谢大家的观看!

欢迎大家关注我的  公  众   号  《coder练习生》



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有