AspectJ切入点:匹配指定类方法并排除特定子类的写法疑问
解决AspectJ切点表达式的类排除问题
我来帮你搞定这个AspectJ切点表达式的组合问题!你已经正确匹配到了目标方法,现在只需要把排除逻辑和原有表达式用正确的逻辑运算符结合起来就行,关键是要注意运算符的优先级。
正确的切点表达式写法
你需要把原有匹配两个方法的表达式用括号括起来,再通过&&和排除逻辑组合,这样就能保证先匹配到目标方法,再排除掉特定类的所有方法:
(execution(* com.acme.dao.impl.*DaoImpl.getAll(..)) || execution(* com.acme.dao.impl.*DaoImpl.getNRecs(..))) && !execution(* com.acme.dao.impl.*ViewDaoImpl.*(..))
为什么要加括号?
AspectJ中逻辑运算符的优先级是&&高于||,如果不加括号,表达式会被解析成:execution(...) && !execution(...) || execution(...)
这就会导致第二个getNRecs(..)方法的匹配不会应用排除逻辑,完全不符合你的需求,所以括号是必须的。
更简洁的替代写法
如果你觉得上面的表达式有点冗长,也可以用within来先限定类范围,再排除特定类,最后匹配方法名,这样逻辑更清晰:
within(com.acme.dao.impl.*DaoImpl) && !within(com.acme.dao.impl.*ViewDaoImpl) && (execution(* getAll(..)) || execution(* getNRecs(..)))
这种写法先圈定所有*DaoImpl类,排除掉*ViewDaoImpl,再匹配其中的getAll和getNRecs方法,效果和之前的表达式完全一致,但可读性更好。
内容的提问来源于stack exchange,提问作者Viktor
相关产品推荐
相关产品推荐

