问题标签 [pointcuts]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
860 浏览

aop - 面向切面编程中的连接点

我目前正在研究 AOP 及其重要部分,即Advice、PointcutsJoin Points。我从这个链接中 阅读了关于什么是建议切入点的非常易于理解的解释。面向方面编程与面向对象编程

但是,我很难理解什么是加入点。根据我的阅读,连接点是程序结构中明确定义的位置,方面可以在其建议代码中编织。

但是,当谈到真正的例子时,我找不到任何好的例子来理解连接点的例子。

从上面链接中的示例中可以看出,如果 Advice 和 Poincuts 是下面写的,那么我们在哪里定义连接点?

经典方法:

建议:

切入点:

0 投票
2 回答
2693 浏览

spring - spring AoP,具有相同参数类型的重载方法的切入点表达式

我已经为评论上的 CRUD 操作定义了一个类。读取方法被重载。

我尝试过的切入点表达式是

问题:由于 userId 和 subjectId 的数据类型相同,点表达式应用于方法 2 时会将参数值移动 1 位。这意味着,表达式不理解第一个参数 userId 未传递。相反,userId 将“subjectId”作为值,而 subjectId 将相邻参数“param”作为其值。

笔记

  1. 我试图避免编写另一种方法,例如 findUserComments()。

  2. 我想在整个应用程序中保持一致性。还有其他类具有类似的 CRUD 操作模式。

问题:是否可以定义一个适用于这两种方法的表达式,第一个参数 userId 是可选的?

编辑 - 解决方案 当我按照以下解决方案中的建议使用不同的方法时,我终于删除了方法 2。我在方法 1 中处理这种情况。

0 投票
1 回答
591 浏览

java - 阅读和理解 AspectJ 切入点?

这个切入点,命名为服务,在服务器对象调用它们的公共方法时挑选出程序执行中的那些点。它还允许使用服务切入点的任何人访问正在调用其方法的 Server 对象。(取自https://eclipse.org/aspectj/doc/released/progguide/language-anatomy.html

我正在尝试理解 AspectJ 的切入点,目前有点困惑。我的主要问题是:您如何阅读上述切入点,以及如何将其含义“拼凑”在一起?

为了说明我的困惑,让我们尝试从头开始构建:

以下切入点将拦截对任何对象的所有公共方法调用,对吗?

现在,这个呢:

我假设在调用 Server 对象的公共方法时会拦截任何点。

现在,我如何从这里到达初始示例 0?我如何阅读它?

在构建切入点时,您会先提供参数列表吗?

和上面的2一样吗?(我感觉它不起作用,如果它起作用了,它会“拦截”每个公共方法调用,就像数字 1 一样。)无论如何,以下内容是否相同?(我s还没有用原生切入点“捕获”,所以我不能真正定义它,可以吗?)

或者你会从指定一个原生切入点开始,以“捕获”目标对象,如下所示:

我想这仍然会拦截任何对象上的所有公共方法调用?

下面的工作是否只能拦截对 Server 对象的调用,并“捕获”该对象(而不使其可用于稍后传递,例如传递给通知)?

现在,回到原来的切入点:

是不是一样

所以,总结一下:你如何开始破译 0?

您是否首先查看target切入点,然后查看切入点的参数类型services并“从内到外”/“从右到左”阅读它?还是先看参数列表,再看services切入点,看看参数是从哪里来的(即target(s))?

还是我让这太复杂了?我是否在某处遗漏了重要信息来帮助我理解这一点?

编辑:手册从左到右解释它 - 但是Server s如果我还没有“执行”,参数的参数来自target(s)哪里?

0 投票
0 回答
319 浏览

java - 如何在春季启用全功能aspectj

如何在 spring 项目中启用全功能 aspectj 以便能够使用条件切入点?

现在我在配置文件中有:

……

但是当我想创建这样的切入点时:

有一个编译异常说:切入点表达式'execution(public * *(..))&& if()'包含不受支持的切入点原语'if',基本上是因为有spring AOP作用而不是Aspecj。

那么我如何使用 aspectj AOP 而不是 Spring AOP?

0 投票
2 回答
265 浏览

java - AspectJ 参数化类型不支持目标切入点

我想创建一个指向列表接口中方法的类。这似乎有效,直到我将目标(列表)添加到我的建议中。我想在添加到(例如)之前和之后查看列表的元素,看看发生了什么变化,但我似乎无法像传递对象那样传递我的列表。这是我到目前为止所拥有的,它不与目标(列表)一起运行,但在没有它的情况下运行:

0 投票
1 回答
26 浏览

java - AspectJ:匹配带注释的子类实例的 GenericServlet.init() 调用

我从 GenericServlet 派生并使用 @Tx 注释该派生类。我想在 servlet 启动期间使用 GenericServlet.init() 方法调用通过 aop 在 servlet 外部触发一些初始化。前两行根本不匹配,第三行显然匹配所有 servlet,第四行匹配所有 servlet,尽管使用注释指定目标。

如果我将 GenericServlet+.init() 替换为 GenericServlet.init(..)

这很奇怪,因为使用调试器,GenericServlet.init() 肯定会从 GenericServlet.init(ServletConfig) 调用...

有人可以澄清一下,这里发生了什么吗?我希望第一行应该可以解决问题,但事实并非如此。

我最好的猜测是它与 Jetty 实例本身使用的类加载器和 webapp 的类加载器的分离有关......我设法使以下至少编织 init() 方法(根据 maspectj 的调试输出) :

但它不会触发。

更新

我将问题追溯到这个:URLClassLoader loading Annotation as com.sun.$Proxy$27

基本上, foo.getClass().isAnnotationPresent(Tx.class) 总是返回 false。现在的问题是:这是什么废话?我怎样才能禁用它?

0 投票
1 回答
70 浏览

spring-boot - 我的方面有两个切入点,但没有工作?

好吧,我有一个问题,这是我的日志方面。他确实有两个Pointcuts。但是每次我请求接口时,我都会重复4次。spring boot 版本 1.5.10.RELEASE github:https ://github.com/spring-projects/spring-boot/issues/12570

0 投票
1 回答
1437 浏览

java - AspectJ:在另一个方法中截取方法的返回结果

我需要帮助来写一些关于这个特殊情况的 Aspectj 建议:

假设我们有这个类:

我想在 method1 中创建一个 Aspectj 建议以获取 getList 的结果。我试试这个:

此建议适用于 getList 方法的所有执行,但我真正想要的是在 method1 调用中获取结果,以获取带有 method1 的 id 的信息,例如:


'我可以看到 ID 为 XXX 的人的列表结果 [4] '

感谢您的帮助。