我在教程中遇到了以下Spring AOP切入点:
execution(public * * (..))
据说它会导致所有公共方法的执行。那是对的吗? AFAIK我们只能拦截公共方法,而公共关键字甚至是非法的。
答案 0 :(得分:3)
除了@ Mario的答案之外,spring docs on AOP还说以下(强调我的):
注意由于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 modifier-pattern
将是public
,protected
等,但是可选的......
答案 1 :(得分:1)
是的,它似乎是一个有效的切入点,它完全符合他所说的。
此外,值得注意的是,将“public”关键字替换为“protected”是完全合法的,它仍然有效!奇怪的是,它也适用于“私人”方法...... (使用Spring 3.1.2 + AspectJ 1.6.9测试)
据我所知,CGLib代理可用于代理受保护的方法,但只有在从不同的对象实例调用它们时它们才有效。从技术上讲,应该可以以与公共方法完全相同的方式建议受保护的方法。
(据@ beny23报道,使用Spring AOP代理实现时,保护/私有方法不起作用,但只能使用Spring驱动的AspectJ编织)
答案 2 :(得分:0)
切入点:designator(modifier returnType package.type.method(params))
在你的情况下
execution(public * * (..))
将在项目目录中使用任意返回类型执行所有公共方法,其中包含0到多个参数