面向切面编程

面向切面编程

面向切面编程(AOP,Aspect Orient Programming) 主要实现的目的是针对业务处理过程中的切面进行提取,所面对的是处理过程中的某个步骤或阶段, 以取得逻辑过程中各个部分之间的低耦合行的隔离效果

AOP 是对OOP的一个横向的补充,主要作用是把一些业务无关的功能抽离,例如日志打印、统计数据、安全控制、异常处理等.这些功能都与核心业务无关,但又随处可见.将其抽离出来用动态插入的方式嵌入到各个业务逻辑中.好处是业务模块可变得比较干净、不受污染,同时功能点能够得到很好的复用,给模块解耦

关键词解释

  1. 切面(Aspect): 共有功能的实现,如日志切面、权限切面、事物切面等.
  2. 通知(Advice): 切面的具体实现,以目标方法为参考点,根据防止的位置不同,可分为前置通知(Before)、后置通知(AfterReturing)、异常通知(AfterThrowing)、最终通知(After)、环绕通知(Around) 5种.
  3. 连接点(JoinPoint): 程序运行过程中能够插入切面的地点,例如方法调用、异常抛出、字段修改等
  4. 切入点(Pointcut): 用于定义通知应该切入到哪些连接点上,不同通知通常需切入到不同连接点上,这种精确的匹配是由切入点的正则来定义的
  5. 目标对象(Target): 是哪些即将切入切面的对象,即哪些被通知的对象.这些对象已经只剩下干干净净的核心业务逻辑代码了
  6. 代理对象(Proxy): 将通知应用到目标对象之后被动态创建的对象,简单理解为代理对象的功能等同于目标对象的核心业务逻辑功能加上公有功能呢,代理对象对于使用者而言是透明的,是程序运行过程中的产物
  7. 织入(Weaving): 将切面应用到目标对象从而创建一个新的代理对象的过程.

实例展示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Function.prototype.before = function (fn) {
const __self = this;

return function () {
fn.apply(this, arguments);
return __self.apply(this, arguments);
};
};

Function.prototype.after = function (fn) {
const __self = this;
return function () {
const result = __self.apply(this, arguments);
fn.apply(this, arguments);
return result;
};
};

function test() {
console.log(2);
return "test";
}

test.after(() => console.log(3)).before(() => console.log(1))();

参考

JS面向切面编程