2016-04-20 38 views
0

我目前使用的AspectJ 1.6.9表达式语法和我不知道为什么下面的切入点表达式:Spring AOP的切点通配符

(execution (* it.dtt..endpoint.*..*.invoke*(..))) 

不匹配方法的执行声明:

protected Object invokeInternal(Object object) throws Exception 
类的

it.dtt.prova.endpoint.Richiesta 

什么想法?

+0

该方法名为invokeInternal的事实应该是触发器。它可能是内部调用的,内部方法调用不适用于AOP。 –

回答

1

“由于Spring AOP的代理性质,protected方法通过定义不被拦截”。

,你需要的是方法的访问修饰符更改为public或考虑使用spring-driven native AspectJ weaving

Spring docs

由于Spring的AOP框架的基于代理的性质,保护 方法是通过定义不被拦截,JDK代理 (这不适用)或CGLIB代理(在技术上这是 但不推荐用于AOP目的)都不被拦截。作为 的后果,任何给定的切入点将仅与公共方法 匹配!

如果您的拦截需求包括受保护/私有方法或构造函数,则考虑使用Spring驱动的本机AspectJ编织 而不是Spring的基于代理的AOP框架。这构成了具有不同特征的AOP使用的不同模式,因此请确保 在做出决定之前先熟悉编织。

+0

是的。如果您需要拦截受保护的或私有的方法或使用更强大的AOP工具(如拦截成员访问等),则可以始终在Spring中使用完整的AspectJ。 – kriegaex