关于 Spring-AOP 切入点和继承的澄清

发布于 2024-12-09 09:36:54 字数 845 浏览 3 评论 0原文

给定 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?

我认为我错过了切入点如何与继承交互的一些基本事实,因此底层的解释/文档可能会大有帮助。

Given the following example classes in my.package...

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

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

and the following Spring-AOP pointcuts...

<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.*(..))" />

What is the result of advice applied to the above pointcuts on instances of Bar? In particular...

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

I think I am missing some basic truth of how pointcuts interact with inheritance so an under-the-hood explanation/doc would probably go a long way.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

转身泪倾城 2024-12-16 09:36:54

来自 aspectj 文档

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

执行(public void Middle.*())

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

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

From aspectj documentation:

When matching method-execution join points, if the execution pointcut
method signature specifies a declaring type, the pointcut will only
match methods declared in that type, or methods that override methods
declared in or inherited by that type. So the pointcut

execution(public void Middle.*())

picks out all method executions
for public methods returning void and having no arguments that are
either declared in, or inherited by, Middle, even if those methods are
overridden in a subclass of Middle. So the pointcut would pick out the
method-execution join point for Sub.m() in this code:

  class Super {
    protected void m() { ... }
  }
  class Middle extends Super {
  }
  class Sub extends Middle {
    public void m() { ... }
  }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文