AOP | 您所在的位置:网站首页 › @aspect注解与@pointcut › AOP |
起因
自己定义了一个切面注解,及处理方法,将他打包封装后供外部调用。 依赖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 实验室设备网 版权所有 |