起因
自己定义了一个切面注解,及处理方法,将他打包封装后供外部调用。
依赖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练习生》