2

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

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

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

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

经典方法:

void set...(...) {
    :
    :
    Display.update();
}

建议:

after() : set() {
   Display.update();
}

切入点:

pointcut set() : execution(* set*(*) ) && this(MyGraphicsClass) && within(com.company.*);
4

1 回答 1

3

void set...(...) 连接


如您所知,AspectConcernPointcutJoinpoint的关联

  • 横切关注点的实现称为关注点
  • 一个类中将要附加关注点的明确定义的位置是Joinpoint
  • 通过配置或代码指定连接点的位置是Pointcut

关注点是对一个或多个利益相关者很重要的事情。此外,关注点在概念上可以分为两类(每类的实现可以相同):

副作用:关注点不会改变连接点的行为,而是引入额外的操作。

日志记录问题是副作用的一个很好的例子,

例如,每次调用目标方法(这是连接点)BankWithdrawalHandler.Execute(ICommand command)都会首先调用关注点LoggingConcern.Execute(ICommand command)

它将能够在Execute方法之前和之后运行,记录诸如开始时间/结束时间/总时间/输入参数/输出参数等内容。

副作用可以:

  • 根据需要检查/捕获目标切入点处的输入参数并执行任何其他处理
  • 根据需要在目标切入点检查/捕获输出结果,并采取任何其他处理

建议:可能会改变目标方法的输入和/或输出的问题。

缓存问题是一个简单的示例 - 例如,每当运行时执行目标方法(这是连接点)Repository.Find<T>(long id)时,该方法CacheConcern.Find<T>(long Id)将被配置为首先运行,并且仅Repository.Find()当在缓存。

建议可以:

  • 检查目标切入点处的输入参数,并在需要时修改它们
  • 取消或避免执行目标方法并用不同的实现替换它
  • 检查目标方法的输出结果并根据需要进行修改或替换

在 .NET 中,有许多既定的技术用于实现切入点

  • 后期构建 IL 编织/PostSharp
  • 依赖倒置(控制反转(IoC)和依赖倒置(DI))
  • 拦截/动态代理
于 2014-03-26T14:37:32.680 回答