我在教程中遇到了以下 Spring AOP 切入点:
execution(public * * (..))
据说这会导致所有公共方法的执行。那是对的吗?AFAIK 我们只能拦截公共方法,而那里的公共关键字甚至是非法的。
我在教程中遇到了以下 Spring AOP 切入点:
execution(public * * (..))
据说这会导致所有公共方法的执行。那是对的吗?AFAIK 我们只能拦截公共方法,而那里的公共关键字甚至是非法的。
除了@Mario 的回答之外,AOP 上的 spring 文档还说以下(强调我的):
注意 由于 Spring 的 AOP 框架基于代理的性质,根据定义,受保护的方法不会被截获,对于 JDK 代理(如果不适用)和 CGLIB 代理(这在技术上可行但不推荐用于 AOP 目的)都不会被拦截. 因此,任何给定的切入点都只会与公共方法匹配!
如果您的拦截需求包括受保护/私有方法甚至构造函数,请考虑使用 Spring 驱动的原生 AspectJ 编织而不是 Spring 的基于代理的 AOP 框架。这就构成了具有不同特点的不同AOP使用模式,所以在做决定之前一定要先熟悉编织。
另外,切入点语法如下:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?
name-pattern(param-pattern) throws-pattern?)
Wherby the will modifier-pattern
bepublic
等protected
但是可选的...
是的,这似乎是一个有效的切入点,并且完全按照他所说的进行。
此外,值得注意的是,将“public”关键字替换为“protected”是完全合法的,并且仍然有效!奇怪的是,它也适用于“私有”方法......(使用 Spring 3.1.2 + AspectJ 1.6.9 测试)
据我所知,CGLib 代理可用于代理受保护的方法,但是它们只有在从不同的对象实例调用时才有效。所以从技术上讲,应该可以以与公共方法完全相同的方式为受保护方法提供建议。
(正如@beny23 所报告的,建议保护/私有方法不适用于 Spring AOP 代理实现,但仅适用于 Spring 驱动的 AspectJ 编织)
切入点:designator(modifier returnType package.type.method(params))
在你的情况下
execution(public * * (..))
将为项目目录中具有任何返回类型的所有公共方法执行 0 到多个参数