Spring AOP错误切入点匹配有效方法的原因及合理性咨询
Spring AOP切入点匹配异常行为是否合理?
实现类
@Component public class TestService { public void test(String target, String key, Object message) { System.out.println("Wrong method"); } public void test(String target, Object message, SomeProcessor processor) { System.out.println("Correct method"); } }
切面类
@Aspect @Component public class TestServiceAspect { @Around(value = "execution(* com.example.TestService.test(..))" + " && args(target, key, message)", argNames = "pjp,target,key,message") public Object traceTest(ProceedingJoinPoint pjp, String target, String key, Object message) throws Throwable { System.out.println("Wrong wrapper"); return pjp.proceed(); } @Around(value = "execution(* com.example.TestService.test(..))" + " && args(target, message, processor)", argNames = "pjp,target,message,processor") public Object traceTest(ProceedingJoinPoint pjp, String target, Object message, SomeProcessor processor) throws Throwable { System.out.println("Correct wrapper"); return pjp.proceed(); } }
调用代码
@RestController public class Tester { private final TestService tst; public Tester(TestService tst) { this.tst = tst; } @RequestMapping(value = "/test", method = RequestMethod.POST) public void testHandler() { System.out.println("START"); tst.test("foo", (Object)"hello", new SomeProcessorImpl()); System.out.println("END"); } }
输出结果
START Wrong wrapper Correct wrapper Correct method END
问题分析与解答
这种行为是合理的,核心原因是Spring AOP中args()切入点表达式的匹配逻辑:它基于运行时参数的类型是否可赋值给切入点声明的参数类型,而非严格匹配方法的形参定义。
在本次调用场景中:
- 实际调用的是
test(String, Object, SomeProcessor)方法 - 第一个切面的
args(target, key, message)声明里,key为String类型,实际第二个参数是Object类型的字符串(字符串可赋值给String);message为Object类型,实际第三个参数SomeProcessor是Object的子类(同样可赋值给Object)。因此Spring AOP在运行时判定该调用满足第一个切入点的参数兼容要求,触发了对应的切面逻辑。
如果需要严格匹配特定重载方法,需优化切入点表达式,在execution()中明确指定方法的参数类型,比如将第一个切面的切入点修改为:
@Around(value = "execution(* com.example.TestService.test(String, String, Object))" + " && args(target, key, message)", argNames = "pjp,target,key,message")
这样就能精准匹配第一个重载方法,避免误触发。
内容的提问来源于stack exchange,提问作者Sasa
相关产品推荐
相关产品推荐

