Pointcut命名有可能导致异常
Pointcut命名有可能导致错误
使用Spring @AspectJ方式的AOP,代码
使用Spring @AspectJ方式的AOP,代码
@Aspect public class AndyaoAspect { @Pointcut("execution(* com.andyao.Repository.get(java.lang.Integer))&& args(id)") public void get(Integer id){ } @Around("get(id)") public Object fromCache(ProceedingJoinPoint pjp, Integer id) throws Throwable { ... } }
这段代码看上去没有什么问题,但是真正执行中,会抛出exception
@Around("get(id)") java.lang.IllegalArgumentException: Pointcut is not well-formed: expecting 'name pattern' at character position 6
翻阅文档发现问题所在:
写道
其他的切入点类型
完整的AspectJ切入点语言支持额外的切入点指定者,但是 Spring不支持这个功能。 他们分别是call, initialization, preinitialization, staticinitialization, get, set, handler, adviceexecution, withincode, cflow, cflowbelow, if, @this 和 @withincode。 在Spring AOP中使用这些指定者将会导致抛出IllegalArgumentException异常。
Spring AOP支持的切入点指定者可能在将来的版本中得到扩展,不但支持更多的AspectJ 切入点指定者(例如"if"),还会支持某些Spring特有的切入点指定者,比如"bean"(用于匹配bean的名字)。
所以在使用spring AOP的时候不能以上面的诸如call,get等命名,不然就会报异常。 完整的AspectJ切入点语言支持额外的切入点指定者,但是 Spring不支持这个功能。 他们分别是call, initialization, preinitialization, staticinitialization, get, set, handler, adviceexecution, withincode, cflow, cflowbelow, if, @this 和 @withincode。 在Spring AOP中使用这些指定者将会导致抛出IllegalArgumentException异常。
Spring AOP支持的切入点指定者可能在将来的版本中得到扩展,不但支持更多的AspectJ 切入点指定者(例如"if"),还会支持某些Spring特有的切入点指定者,比如"bean"(用于匹配bean的名字)。