以下切入点是否有效?

时间:2012-10-02 21:56:22

标签: spring aop spring-aop

我在教程中遇到了以下Spring AOP切入点:

execution(public * * (..))

据说它会导致所有公共方法的执行。那是对的吗? AFAIK我们只能拦截公共方法,而公共关键字甚至是非法的。

3 个答案:

答案 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将是publicprotected等,但是可选的......

答案 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到多个参数

相关问题