【问题标题】:Clarification around Spring-AOP pointcuts and inheritance关于 Spring-AOP 切入点和继承的说明
【发布时间】:2011-10-11 14:13:49
【问题描述】:

鉴于my.package中的以下示例类...

public class Foo {
    public void logicNotInBar()     {/*code*/}
    public void logicBarOverrides() {/*code*/}
}

public class Bar extends Foo {
    public void logicBarOverrides() {/*code*/}
}

以及以下 Spring-AOP 切入点...

<aop:pointcut id="myPointcutAll" expression="execution(* my.package.*.*(..))"   />
<aop:pointcut id="myPointcutFoo" expression="execution(* my.package.Foo.*(..))" />
<aop:pointcut id="myPointcutBar" expression="execution(* my.package.Bar.*(..))" />

将建议应用于上述 Bar 实例的切入点的结果是什么?特别是……

Bar bar = new Bar();
bar.logicNotInBar();      // will myPointcutBar advice trigger?
bar.logicBarOverrides();  // is myPointcutFoo ignored here?

我认为我错过了切入点如何与继承交互的一些基本事实,因此引擎盖下的解释/文档可能会有很长的路要走。

【问题讨论】:

  • 不会应用任何建议,因为 Bar 不是“代理 Bean”,您不能手动实例化必须建议的类...必须将其定义为 Spring Bean:@987654321 @
  • 而且最好使用接口,并在这些接口而不是实现上定义切入点:static.springsource.org/spring/docs/3.0.0.M3/…

标签: java aspectj spring-aop pointcut


【解决方案1】:

来自aspectj documentation

匹配方法-执行连接点时,如果执行切入点 方法签名指定声明类型,切入点只会 匹配在该类型中声明的方法,或覆盖方法的方法 在该类型中声明或继承。所以切入点

执行(public void Middle.*())

挑选出所有方法执行 对于返回 void 且没有参数的公共方法 在 Middle 中声明或继承,即使这些方法是 在 Middle 的子类中被覆盖。所以切入点会挑选出 此代码中 Sub.m() 的方法执行连接点:

  class Super {
    protected void m() { ... }
  }
  class Middle extends Super {
  }
  class Sub extends Middle {
    public void m() { ... }
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多