AOP——0 can't find referenced pointcut runTime 错误

417 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情

起因

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

依赖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哈哈~。

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