【问题标题】:Spring AOP pointcut expression syntax for wildcard通配符的 Spring AOP 切入点表达式语法
【发布时间】:2016-04-20 12:41:28
【问题描述】:

我目前正在使用 AspectJ 1.6.9,我想知道为什么下面的切入点表达式:

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

与声明的方法的执行不匹配:

protected Object invokeInternal(Object object) throws Exception

班级:

it.dtt.prova.endpoint.Richiesta

有什么想法吗?

【问题讨论】:

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

标签: spring aop pointcut


【解决方案1】:

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

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

Spring docs

由于 Spring 的 AOP 框架基于代理的特性,受保护 根据定义,方法不会被拦截,JDK 代理也不会被拦截 (这不适用)也不适用于 CGLIB 代理(如果这是 技术上可行但不推荐用于 AOP 目的)。作为一个 结果,任何给定的切入点都将与公共方法匹配 只有!

如果您的拦截需求包括受保护/私有方法,甚至 构造函数,考虑使用 Spring 驱动的原生 AspectJ 编织 而不是 Spring 的基于代理的 AOP 框架。这构成了一个 不同特性的AOP使用模式不同,所以一定要 在做出决定之前先让自己熟悉编织。

【讨论】:

  • 是的。如果您需要拦截受保护或私有方法或使用更强大的 AOP 工具(如拦截成员访问等),您始终可以在 Spring 中使用完整的 AspectJ。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多