> AOP (面向切面编程):定义要切入的类或者方法 (普通类、注解类),加入切面额外的逻辑控制,主要用于日志记录、性能统计、安全控制、事务处理、异常处理等等。
## 切面实现
~~~
namespace App\Aspect;
use App\Service\SomeClass;
use App\Annotation\SomeAnnotation;
use Hyperf\Di\Annotation\Aspect;
use Hyperf\Di\Aop\AbstractAspect;
use Hyperf\Di\Aop\ProceedingJoinPoint;
/**
* @Aspect
*/
class FooAspect extends AbstractAspect
{
// 要切入的类,可以多个,亦可通过 :: 标识到具体的某个方法,通过 * 可以模糊匹配
public $classes = [
SomeClass::class,
'App\Service\SomeClass::someMethod',
'App\Service\SomeClass::*Method',
];
// 要切入的注解,具体切入的还是使用了这些注解的类,仅可切入类注解和类方法注解
public $annotations = [
SomeAnnotation::class,
];
public function process(ProceedingJoinPoint $proceedingJoinPoint)
{
// 切面切入后,执行对应的方法会由此来负责
// $proceedingJoinPoint 为连接点,通过该类的 process() 方法调用原方法并获得结果
// 在调用前进行某些处理
$result = $proceedingJoinPoint->process();
// 在调用后进行某些处理
return $result;
}
}
~~~
## 代理类缓存
> 所有被 AOP 影响的类,都会在`./runtime/container/proxy/`文件夹内生成对应的`代理类缓存`,当如果更改了AOP代码后不生效,应先清除对应缓存才行