首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Spring AOP: JoinPoint和PointCut有什么不同?

Spring AOP: JoinPoint和PointCut有什么不同?
EN

Stack Overflow用户
提问于 2013-03-16 16:53:47
回答 6查看 94.3K关注 0票数 95

我正在学习面向方面的编程概念和Spring AOP。我无法理解Pointcut和Joinpoint之间的区别--它们对我来说似乎都是一样的。Pointcut是您应用建议的地方,而Joinpoint也是我们可以应用建议的地方。那有什么区别呢?

一个切入点的例子可以是:

代码语言:javascript
复制
@Pointcut("execution(* * getName()")

Joinpoint的一个例子是什么?

EN

回答 6

Stack Overflow用户

发布于 2013-03-18 17:29:31

要理解连接点和切入点之间的区别,可以将切入点视为指定编织规则,将连接点视为满足这些规则的情况。

在下面示例中,

代码语言:javascript
复制
  @Pointcut("execution(* * getName()")  

切入点定义的规则是,建议应该应用于任何包中任何类中的getName()方法,连接点将是类中存在的所有getName()方法的列表,以便可以在这些方法上应用建议。

(在Spring的情况下,规则将仅应用于托管bean,而通知只能应用于公共方法)。

票数 32
EN

Stack Overflow用户

发布于 2013-03-17 22:18:52

两者都与面向方面编程的“位置”有关。

连接点是一个单独的地方,您可以在这里使用AOP执行代码。例如,“当一个方法抛出异常时”。

切入点是连接点的集合。例如,“当类Foo中的方法抛出异常时”。

票数 7
EN

Stack Overflow用户

发布于 2014-04-16 17:35:38

spring中的AOP有{Advisor,Advice,Pointcut,Joinpoint}

正如您所知道的,aop的主要目的是将横切关注点逻辑(方面)从应用程序代码中解耦,以在Spring中实现这一点,我们使用(通知/顾问)

Pointcut用于过滤我们想要准确应用此建议的位置,比如“所有方法都以insert开头”,因此其他方法将被排除。这就是为什么我们在Pointcut接口{ClassFilter和MethodMatcher}中有这样的方法。

所以通知是横切逻辑的实现,顾问是通知加上PointCut,如果你只使用通知,spring会将它映射到顾问,并使切入点为真,这意味着不会阻塞任何东西。这就是为什么当您只使用通知时,它会应用于目标类的所有方法,因为您没有对它们进行过滤。

但是Joinpoint是程序中的一个位置,当你访问class对象时,你可以把它想成反射,然后你可以得到方法对象,然后你可以调用这个类中的任何方法,这就是编译器的工作方式,如果你这样想,你可以想象Joinpoint。

Joinpoint可以是字段、构造函数或方法,但在Spring中我们只有方法的连接点,这就是为什么在Spring中我们有(之前、之后、抛出、环绕)类型的连接点,所有这些类型都引用类中的位置。

正如我提到的,你可以有没有切入点的通知(没有过滤器),然后它将被应用到所有的方法,或者你可以有advisor,它将被应用到特定的方法,但你不能有没有连接点的通知,比如pointcut,你必须指定它,这就是为什么spring中的通知类型与连接点是完全相同的类型,所以当你选择一个通知时,你隐式地选择了哪个连接点。

总而言之,通知是你的方面到目标类的实现逻辑,这个建议应该有一个连接点,就像在调用之前,在调用之后,在抛出或围绕调用之后,然后你可以过滤你想要应用它的地方,使用pointcut来过滤方法,或者不使用pointcut (无过滤器),这样它将被应用于类的所有方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15447397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档