当前位置: 首页 > 面试题库 >

关于Spring-AOP切入点和继承的说明

司徒骞尧
2023-03-14
问题内容

给定以下示例类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?

我想我缺少切入点如何与继承交互的一些基本真理,因此幕后的解释/文档可能会走很长一段路。


问题答案:

从aspectj文档中:

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

执行(公共无效的中间*())

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

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


 类似资料:
  • 主要内容:切入点,语法,运行项目切入点(JoinPoint)代表示您的应用程序中可以插入AOP方面的某个点。 您也可以说,这是应用程序中使用Spring AOP框架执行操作的实际位置。 请考虑以下示例: 包中包含的所有方法类。 一个类的特定方法。 切入点 切入点()是一组一个或多个连接点,其中它用来执行通知。可以使用表达式或模式指定切入点,我们将在下面AOP示例中看到。 在Spring,切入点有助于使用特定的连接点来应用通知。

  • 主要内容:连接点,切入点,运行项目连接点 连接点()代表您的应用程序中可以插入AOP方面的一个点/位置。 您也可以说,这是应用程序中使用Spring AOP框架执行操作的实际位置。 请考虑以下示例: 包中包含的所有方法类。 一个类的特定方法。 切入点 切入点()是一组一个或多个连接点,在其中应该执行的通知。 您可以使用表达式或模式指定切入点,我们将在AOP示例中看到。 在Spring中切入点有助于使用特定的连接点来应用通知。 请考

  • 我有@tenatable注释来决定切入点: 这是我的观点: 这对于这个服务类来说没有任何问题: 当我调用doSomething()方法时,我的方面正在运行,这没问题,但我想为属于spring数据的CrudRepository接口实现方面。 我已经改变了我的Aspect来实现这一点,如下所示: 这是存储库: 但当我调用MyRepository中的任何方法时,它都不起作用。 有什么办法吗? 编辑:当我

  • 下面是我的代码片段: 服务我mpl.java 现在,我想要的是每当从方法worker(请求,字符串id)抛出null点异常时,我想要执行一些特定的任务,如上图所示。为此,我编写了一个方面类,如下所示: 我的方面。Java语言 电流输出: 期望输出: 如您所见,没有被触发,因此没有打印值。这是什么原因? 注: > 还尝试更改方法的名称,以消除任何也不起作用的重载问题。 到目前为止,尝试了各种其他切入

  • 我对Spring和AOP是新手。我正在尝试这个简单的事情,我已经创建了一个自定义注释,当放在任何方法之前时,它应该执行一些代码。这是我创建的注释 问题是我的spring aop从来没有被触发过。我在中包含了一个bean 有人能指出我缺少什么吗?

  • 问题是@before和@afterreturn有效,但对于pointcut却不是这样。