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

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

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

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

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

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

Joinpoint的一个例子是什么?

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2014-09-11 13:42:15

连接点:连接点是可以插入方面的应用程序的程序执行中的候选点。这一点可以是一个被调用的方法,一个被抛出的异常,甚至是一个被修改的字段。在这些点上,可以将方面的代码插入到应用程序的正常流程中,以添加新的行为。

API建议:这是一个对象,它包括对系统范围的关注点的调用,表示要在一个点指定的连接点执行的操作。

切入点:切入点定义了应该在哪些连接点上应用相关的建议。建议可以应用于AOP框架支持的任何连接点。当然,您不希望将所有方面应用于所有可能的连接点。Pointcuts允许您指定要将建议应用到的位置。通常,您可以使用显式的类和方法名称或通过定义匹配的类和方法名称模式的正则表达式来指定这些切入点。一些AOP框架允许您创建动态切入点,以根据运行时决策(例如方法参数的值)确定是否应用通知。

下图可以帮助你理解建议,PointCut,连接点。

Source

使用餐厅类比的解释: Source by @Victor

当你去餐馆的时候,你看着菜单,看到有几个选项可供选择。您可以订购菜单上的一个或多个项目。但在你真正点菜之前,它们只是“用餐的机会”。一旦你下了订单,服务生把它送到你的桌子上,这就是一顿饭。

连接点是菜单上的选项,而切入点是您选择的项目。

连接点是代码中的商机,您可以将aspect...just应用于商机。一旦你抓住这个机会,选择一个或多个连接点,并对它们应用一个方面,你就得到了一个切入点。

Wiki

连接点

是程序控制流中的一个点,在这里控制流可以通过两个不同的路径(IMO:这就是为什么调用联合)到达。

Advice描述了一类用于修改其他函数的函数

一个切入点是一个匹配的连接点的P类型,即一组连接点。

票数 175
EN

Stack Overflow用户

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

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

在下面示例中,

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

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

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

票数 32
EN

Stack Overflow用户

发布于 2016-09-03 04:15:20

为刚接触AOP概念的人提供的门外汉解释。这不是详尽的,但应该有助于掌握概念。如果你已经熟悉了基本的行话,你可以停止阅读了。

假设您有一个普通的类Employee,并且您希望在每次调用这些方法时执行一些操作。

代码语言:javascript
复制
class Employee{
    public String getName(int id){....}
    private int getID(String name){...}
}

这些方法称为JoinPoints。我们需要一种方法来识别这些方法,这样框架就可以在它加载的所有classes.methods中找到这些方法。所以我们将编写一个正则表达式来匹配这些方法的签名。正如你将在下面看到的,这个正则表达式定义了切入点。例如:

代码语言:javascript
复制
* * mypackage.Employee.get*(*)

第一个*表示修饰符public/private/protected/default。第二个*是方法的返回类型。

但是,你还需要告诉另外两件事:

  1. When是否应该采取行动-例如在方法执行之前/之后或在exception
  2. What上是否应该在匹配时采取行动(可能只是打印一条消息)

这两者的组合被称为 combination

正如你可以想象的那样,你必须写一个函数才能做#2,所以这就是它在基础知识中可能的样子。

注意:为了清晰起见,请使用word REGEX而不是* * mypackage.Employee.get*(*)。实际上,完整的表达式包含在定义中。

代码语言:javascript
复制
@Before("execution(REGEX)")
public void doBeforeLogging() {....}   <-- executed before the matching-method is called

@After("execution(REGEX)")
public void doAfterLogging() {....}  <-- executed after the matching-method is called

一旦你开始大量使用这些建议,你可能最终会指定许多@After/@之前/@Around忠告。重复的正则表达式最终会使事情变得混乱和难以维护。所以我们要做的就是给表达式起一个名字,然后在Aspect类的其他地方使用它。

代码语言:javascript
复制
@Pointcut("execution(REGEX)") <-- Note the introduction of Pointcut keyword
public void allGetterLogging(){} <-- This is usually empty

@Before("allGetterLogging")
public void doBeforeLogging() {....}

@After("allGetterLogging")
public void doAfterLogging() {....}

顺便说一句,你可能还想把整个逻辑包装在一个叫做Aspect的类中,然后你可以写一个类:

代码语言:javascript
复制
@Aspect
public class MyAwesomeAspect{....}

要让所有这些东西工作,您必须告诉Spring解析类,以读取、理解@ AOP关键字并对其执行操作。一种方法是在spring配置xml文件中指定以下内容:

<aop:aspectj-autoproxy>

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

https://stackoverflow.com/questions/15447397

复制
相关文章

相似问题

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