news 2026/6/10 16:01:24

AOP编程有三大场景:控制器切面,内部切面,外部切面,你get到了吗?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AOP编程有三大场景:控制器切面,内部切面,外部切面,你get到了吗?

果用过NestJS框架都知道,在NestJS框架中AOP编程包括以下几个能力:Middleware、Guard、Interceptor、Pipe、Filter。事实上AOP编程的应用场景更广泛,上述所列5个能力仅仅是AOP编程的子集。下面,我们看看在VonaJS框架中,AOP编程是怎样的。

VonaJS AOP编程

VonaJS AOP 编程包括三个方面的能力:

控制器切面: 为 Controller 方法切入逻辑

内部切面: 在 Class 内部,为任何 Class 的任何方法切入逻辑

外部切面: 在不改变 Class 源码的前提下,从外部为任何 Class 的任何方法切入逻辑

控制器切面

控制器切面清单

Middleware

Guard

Intercepter

Pipe

Filter

执行时序图

控制器切面的执行时序图如下:

aspect-controller

洋葱模型: Middleware和Intercepter支持洋葱模型,允许在Controller Action之前和之后执行切面逻辑

Middleware: 针对不同的执行时序节点,系统提供了三种 Middleware: Middleware System、Middleware Global和Middleware Local,从而可以实现更精细化的切面逻辑

Route Match: 只有Middleware System在路由匹配之前执行,其余在路由匹配之后执行

Filter: 任何环节抛出异常,都会执行Filter,从而自定义错误信息和错误日志的处理逻辑

内部切面

内部切面提供两个机制:AOP Method和魔术方法

1. AOP Method

直接在 Class Method 上通过装饰器切入逻辑

举例:数据库事务

class ServiceStudent {

+ @Database.transaction()

async update(id: TableIdentity, student: DtoStudentUpdate) {

return await this.scope.model.student.updateById(id, student);

}

}

@Database.transaction:通过AOP Method机制实现的装饰器,可以直接提供数据库事务能力

举例:日志

class ServiceStudent {

+ @Log()

async update(id: TableIdentity, student: DtoStudentUpdate) {

return await this.scope.model.student.updateById(id, student);

}

}

@Log:通过AOP Method机制实现的装饰器,可以直接提供日志能力

2. 魔术方法

可以在 Class 内部通过__get__和__set__切入动态属性或方法

举例:获取 model 实例

class ServiceStudent {

async update(id: TableIdentity, student: DtoStudentUpdate) {

+ return await this.scope.model.student.updateById(id, student);

}

}

this.scope.model.xxx: 没有使用依赖注入,而是使用依赖查找,直接通过 scope 对象获取 model 实例,从而简化代码的书写风格

实现思路

系统提供了一个 Class ServiceModelResolver,用于实现 model 实例的动态解析,代码如下:

class ServiceModelResolver {

protected __get__(prop: string) {

const beanFullName = `${this[SymbolModuleScope]}.model.${prop}`;

return this.bean._getBean(beanFullName as any);

}

}

当调用this.scope.model.student时,会自动执行__get__方法,并且传入参数prop: 'student'

将参数prop与当前模块名称合并成beanFullName

通过beanFullName从全局容器中获取 model 实例,并返回给调用者

外部切面

仍以 Class ServiceStudent的update方法为例,通过外部切面来实现日志能力:

import { Aop } from 'vona-module-a-aspect';

@Aop({ match: 'demo-student.service.student' })

class AopLog {

async update(_args: Parameters<any>, next: Function, _receiver: any) {

const timeBegin = Date.now();

const res = await next();

const timeEnd = Date.now();

console.log('time: ', timeEnd - timeBegin);

return res;

}

}

@Aop: 此装饰器用于实现外部切面

match: 用于将 Class AopLog与 Class ServiceStudent关联,ServiceStudent的 beanFullName 是demo-student.service.student

update: 在AopLog中提供与ServiceStudent同名的方法update,实现自定义逻辑即可

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:35:18

EmotiVoice语音合成的艺术性探索

EmotiVoice语音合成的艺术性探索 在虚拟主播的一场直播中&#xff0c;观众弹幕突然刷起“心疼你”&#xff0c;镜头前的3D形象眼眶微红&#xff0c;声音也从欢快转为低沉&#xff1a;“是啊……我也觉得有点难过。”这句回应并非预录&#xff0c;而是由AI实时生成——语调中的颤…

作者头像 李华
网站建设 2026/6/10 1:04:29

工业场景实战案例--wifi联网

我是嵌入式学习菌&#xff0c;一名热爱学习的嵌入式工程师关注我&#xff0c;一起变得更加优秀&#xff01;嵌入式学习菌CSDN、B 站视频号同名同步分享嵌入式学习点滴&#xff5e; 无捷径唯有坚持&#xff0c;愿与你并肩稳步前行&#xff01;17篇原创内容公众号下面结合工业场景…

作者头像 李华
网站建设 2026/6/10 16:14:07

ATI显卡驱动下载与安装方法 新手必看指南

ATI 显卡&#xff08;现归属于 AMD&#xff09;因其良好的图形处理能力和性价比&#xff0c;被广泛应用于办公电脑、设计工作站及游戏设备中。显卡驱动作为连接硬件与系统的重要桥梁&#xff0c;若版本不匹配或安装异常&#xff0c;容易导致分辨率异常、画面卡顿甚至系统崩溃。…

作者头像 李华
网站建设 2026/6/9 22:21:50

《Vue 项目路由 + Layout 的最佳实践》

[toc] 前言&#xff1a;路由乱&#xff0c;本质是“页面结构没设计” 很多项目后期路由文件看起来像这样&#xff1a; 一个文件 1000 行Layout 套 Layout新页面不知道该放哪 说白了就是一句话&#xff1a;路由和页面结构是“边写边凑”的。一、Layout 的职责一定要收紧 一句话…

作者头像 李华
网站建设 2026/6/9 19:15:55

一文搞懂鲸鱼优化算法Whale Optimization Algorithm(WOA)!!!(核心原理+数学模型+代码实战+实际应用)

文章目录 文章脉络 1 生物灵感与核心思想 1.1 座头鲸的泡泡网捕食法 1.2 从自然行为到优化算法 2 算法流程与数学模型 2.1 算法前提与初始化 2.2 数学模型与核心公式 1. 包围猎物机制 2. 气泡网攻击(螺旋更新位置) 3. 搜索猎物(全局探索) 2.3 算法完整流程 3 Python代码实现…

作者头像 李华
网站建设 2026/6/10 0:31:30

2026年度必藏!国内TOP9免费免版权可商用音频素材网站排行榜,个人/企业首选,彻底规避侵权风险,速看宝藏清单!

在视频制作、广告宣传、内容创作等场景中&#xff0c;音频素材是不可或缺的核心元素。与图片、字体等素材相同&#xff0c;音频作品受版权法保护&#xff0c;未经授权使用&#xff08;无论商用还是非商用&#xff09;都可能引发侵权纠纷。免费下载不等于免费使用&#xff0c;付…

作者头像 李华