你知道什么是 AOP 吗?

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 你知道什么是 AOP 吗?

文章目录:

  • 前言
  • AOP 与 OOP 的区别
  • AOP 能做什么
  • AOP 的一种实现
  • 推荐阅读


前言

AOP 的全称为 Aspect Oriented Programming,意思是:面向切面编程。

为什么会有这篇文章?是因为看了 Laravel 中 Pipeline 的设计,发现 Pipeline 就是基于 AOP 思想的一种实现。

说起 AOP,就不得不说起 OOP,它们又是什么关系,有什么区别?

AOP 与 OOP 的区别

OOP 我们都知道,全程为 Object Oriented Programming ,意思是:面向对象编程。

首先我们要知道 AOPOOP 不是相互对立的关系,可以把 AOP 看作是弥补 OOP 的不足,以此之长、补彼之短,两者结合使用效果最佳。

OOP 是针对业务 实体 及其 属性行为 进行 抽象封装 ,这个不难理解,例如:用户模块、订单模块 等。

AOP 是针对业务切面进行提取,它所面对的是处理过程中的某个 步骤阶段 ,以达到逻辑处理过程中各部分之间低耦合性的 隔离效果 ,例如:日志记录、权限验证 等。

举个例子就容易理解了,如果单纯使用 OOP ,需要在日志模块、订单模块中进行权限验证、日志记录怎么办?难道要在每个方法前都加入权限验证、日志记录的代码吗?那么如果需要在每个方法前和方法后都记录日志怎么办?

这时如果使用 AOP,就可以借助代理完成这些重复的操作,就可以不在每个方法前加入权限验证、日志记录的代码,降低各部分之间的耦合。

AOP 能做什么

除了上面说的 权限验证、日志记录,AOP 还可以做 数据加解密、请求响应数据规范 ...

只要是和具体的业务无关的,同时又是业务都在关注的,那么都可以通过 AOP 去抽离这些关注点并将其统一维护,提高代码的复用性。

上面的业务关注点是不是有点似曾相识... 其实我们常用的 路由中间件 就是基于 AOP 思想的一种实现。

AOP 的一种实现

举例:Laravel 中的 路由中间件

/**
 * Send the given request through the middleware / router.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
protected function sendRequestThroughRouter($request)
{
    $this->app->instance('request', $request);
    Facade::clearResolvedInstance('request');
    $this->bootstrap();
    return (new Pipeline($this->app))
                ->send($request)
                ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
                ->then($this->dispatchToRouter());
}

通过上述代码,可以发现需要执行的中间件配置在 through() 方法中,执行后再执行 then 方法。

上述代码用在了 路由中间件 中,当然也可以用在其他地方,比如用到 controller 中,就可以这样写:

// 示例代码
$pipes = [
    LoggingPipeline::class,   // 日志记录
    PermitPipeline::class,    // 权限验证
];
return app(Pipeline::class)
    ->send($request->all())
    ->through($pipes)
    ->then(function ($content) {
        return $content;
    });

上面只是在 Laravel 中的一种实现,当然在 PHP 的其他框架中也有类似的实现,例如:YiiThinkPHP 等。

AOP 只是个思想,当然也有其他语言实现,例如:GolangJava 等。

推荐阅读


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
消息中间件 关系型数据库 Kafka
一种小资源情况下RDS数据实时同步StarRocks方案
使用一台4C8 G服务器轻松实现2个MySQL实例中通过负责分库分表规则之后的5000多张表的数据实时同步到StarRocks
553 67
|
存储 人工智能 算法
数据安全与隐私保护在人工智能时代的挑战与应对
随着人工智能技术的快速发展,数据安全和隐私保护问题日益凸显。本文将探讨在人工智能时代下,数据安全面临的挑战以及如何有效应对,为保护用户数据和维护信息安全提供新思路。
1888 13
|
缓存 Ubuntu 网络协议
ubuntu ifconfig命令找不到
综上所述,面对 `ifconfig`缺失的问题,用户应首先考虑使用替代命令或通过安装额外软件包来解决,同时注意权限管理和环境变量的正确配置。通过这些策略,可以确保在Ubuntu系统中高效、无障碍地管理网络配置。
694 0
|
缓存 网络协议 网络性能优化
基于 Wireshark 分析 IP 协议
基于 Wireshark 分析 IP 协议
|
安全 数据安全/隐私保护
使用了代理IP之后软件或网站还是拒绝访问的原因分析
代理IP使用后仍被拒访可能因无效IP、网站反代理机制、设置错误、网络问题或软件设置不当。检查代理有效性,确认网站限制,修正设置,确保网络稳定,及调整软件代理配置是解决之道。遇到问题需针对性排查。
|
Kubernetes 负载均衡 Linux
k8s教程(service篇)-概念和原理(上)
k8s教程(service篇)-概念和原理(上)
441 0
|
网络协议 数据安全/隐私保护 Windows
解决谷歌浏览器右键翻译为简体中文(无法翻译此网页的问题)
解决谷歌浏览器右键翻译为简体中文(无法翻译此网页的问题)
解决谷歌浏览器右键翻译为简体中文(无法翻译此网页的问题)
|
机器学习/深度学习 存储 算法
基于Dijkstra和A*算法的机器人路径规划(Matlab代码实现)
基于Dijkstra和A*算法的机器人路径规划(Matlab代码实现)
211 0
|
数据采集 移动开发 数据可视化
空间转录组|Load10X_Spatial函数修改适配多形式数据 + 空转标准流程
空间转录组|Load10X_Spatial函数修改适配多形式数据 + 空转标准流程
1144 0