记住用户名密码
面向切面编程,通过预编译方式或者运行期动态代理实现程序功能的统一维护的一种技术
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 条留言 其中:访客:0 条, 博主:0 条