AOP是什么

全屏阅读
  • 基本信息
  • 作者:
  • 作者已发布:924篇文章
  • 发布时间:2022年10月12日 17:41:41
  • 所属分类:Hyperf
  • 阅读次数:442次阅读
  • 标签:

面向切面编程,通过预编译方式或者运行期动态代理实现程序功能的统一维护的一种技术

AOP是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果

每个方法的前后就是切面。

Hyperf的AOP是基于DI实现的

必须使用的是Hyperf的DI组件,即hyperd/di

必须通过DI创建的对象才能使AOP生效,直接new不行

必须当代理类缓存文件不存在时才会重新生成代理类

AOP的应用场景

参数校验,日志,无侵入埋点,安全控制,性能统计,事务处理,异常处理,缓存,无侵入监控,资源池,连接池管理等

例子

假设有一个IndexController类

通过AOP对该类切入

创建一个Aspect类,并在$classes属性定义该类的index方法

class IndexController
{
	public function index(RequestInterface $request)
	{
		return 'hello';
	}
}
namespace App\Aspect;
class FooAspect extends AbstractAspect
{
	//要切入的类,可以多个,也可以通过::标识到具体的某个方法,通过*可以模糊匹配
	public $classes = [
		SomeClass::class,
		'App\IndexController::index',
	];
}

Aspect 实际通过DI得到的类为下图的一个代理类,储存于runtime/container/proxy
是一个继承原类的子类,原类方法会被重写

class IndexController_sdhafkjshdladjla8374 extends IndexController
{
	use \Hyper\Di\Aop\ProxyTrait;
	public function index(RequesInterface $request)
	{
		$__function__ = __FUNCTION__;
		$__method__ = __METHOD__;
		return self::__proxyCall(IndexController::class,__FUNCTION__,self::getParamsMap(IndexController::class,__FUNCTION__,func_get_args(),function(RequestInterface $request) use($__function__,$__method__){
		});
	}
}

基于AOP的功能

@Cacheable(通过这个注解定义在任意类的方法上,可以对,对应方法的结果缓存) @CachePut(更新缓存) @CacheEvict(移除缓存)

@Task 在任意类的任意方法上定义Task注解 ,表明在调用方法时,将任务分配到task work里面执行,意思是假如有同步阻塞的代码,要在协程里面运行,就能用task

@RateLimit 限流的注解

@CircuitBreaker 熔断器

调用链追踪的无侵入埋点

顶一下
(0)
100%
订阅 回复
踩一下
(0)
100%
» 固定链接:恒富网 » 《AOP是什么》
» 郑重声明:本文由mpxq168发布,所有内容仅代表个人观点。版权归恒富网mpxq168共有,欢迎转载, 但未经作者同意必须保留此段声明,并给出文章连接,否则保留追究法律责任的权利! 如果本文侵犯了您的权益,请留言。

目前有 0 条留言 其中:访客:0 条, 博主:0 条

给我留言

您必须 [ 登录 ] 才能发表留言!