AspectJ切入点表达式配置报错及访问修饰符显式声明疑问
问题解决与疑问解答
切入点表达式错误修正
你的notConfigurationPackage和notFlywayConfigurationClass切入点报错,核心原因是execution表达式里多了一个冗余的*。AspectJ的execution表达式标准结构是:execution([访问修饰符] [返回值类型] [类路径].[方法名]([参数列表]))
你写的!execution(* * com.company.app.configuration..*.*(..))里连续两个*,不符合语法规范。结合你的业务场景,allApplicationCode已经限定了匹配public方法,排除规则不需要再重复指定访问修饰符,直接去掉多余的*即可。
修正后的完整代码:
@Pointcut("execution(public * com.company.app..*.*(..))") fun allApplicationCode() {} @Pointcut("!execution(* com.company.app.configuration..*.*(..))") fun notConfigurationPackage() {} @Pointcut("!execution(* com.company.app..FlywayConfiguration.*(..))") fun notFlywayConfigurationClass() {} @Around("allApplicationCode() && notConfigurationPackage() && notFlywayConfigurationClass()") fun logExecutionTime(joinPoint: ProceedingJoinPoint): Any { // 你的业务代码 }
关于显式声明访问修饰符为*的疑问
显式写*作为访问修饰符是完全没问题的,它表示匹配任意访问修饰符(public、protected、private、默认包访问权限)。但在你的场景里,allApplicationCode已经限定了只匹配public方法,后续的排除规则即使写了*也不会改变逻辑——因为排除的是已经被allApplicationCode筛选过的public方法子集。不过这种写法多余且容易引发语法错误,建议不需要在排除规则里额外指定访问修饰符。
内容的提问来源于stack exchange,提问作者firstpostcommenter
相关产品推荐
相关产品推荐

