【问题标题】:Join Points in Aspect Oriented Programming面向切面编程中的连接点
【发布时间】:2014-05-03 00:54:29
【问题描述】:

我目前正在研究 AOP 及其重要部分,即 Advice、Pointcuts、Join Points。 我从这个链接中读到了关于什么是AdvicePointcuts的非常容易理解的解释。 Aspect Oriented Programming vs. Object-Oriented Programming

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

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

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

经典方法:

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

建议:

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

切入点:

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

【问题讨论】:

    标签: aop aspects pointcuts


    【解决方案1】:

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


    如您所知,AspectConcernPointcutJoinpoint 的关联。 p>

    • 横切关注点的实现称为关注点
    • 在类中明确定义的位置是Joinpoint
    • 通过配置或代码指定连接点的位置是切入点

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

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

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

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

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

    副作用可以:

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

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

    缓存问题是一个简单的例子——例如每当运行时执行目标方法(这是连接点)Repository.Find<T>(long id) 方法 CacheConcern.Find<T>(long Id) 将被配置为首先运行,并且只允许调用继续到 Repository.Find() 方法,如果在中找不到该值缓存。

    建议可以:

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

    在 .NET 中,有许多实现切入点的成熟技术:

    • 后期构建 IL weaving/PostSharp
    • 依赖倒置(控制反转 (IoC) 和依赖倒置 (DI))
    • 拦截/动态代理

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-31
      • 2023-04-03
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多