swoft 切面AOP尝试
官网文档 https://www.swoft.org/documents/v2/basic-components/aop/
视频教程 https://www.bilibili.com/video/BV12J411j721?p=51
切面 我理解 就是不破坏原有代码逻辑,往里面加入需要执行的前置 后置 操作
- PointBean:定义目标类切点
include
:需被 指定 为切点的目标类集合exclude
:需被 排除 为切点的目标类集合
- PointAnnotation:定义 注解类 切点,所有使用对应注解的方法均会通过该切面类代理
inlucde
:需被 织入 的注解类集合exclude
:需被 排除 的注解类集合
- PointExecution:定义确切的目标类方法。
include
:需被 织入 的目标类方法集合,支持正则表达式exclude
:需被 排除 的目标类方法集合,支持正则表达式
定义切面类 app\Aspect\TestAspect.php
指定方法切入的
<?php namespace App\Aspect;
use Swoft\Aop\Annotation\Mapping\After;
use Swoft\Aop\Annotation\Mapping\Aspect;
use Swoft\Aop\Annotation\Mapping\Before;
use Swoft\Aop\Annotation\Mapping\PointExecution; /**
* @Aspect()
* @PointExecution(include={"App\Http\Controller\HomeController::hi.*"})
*/
class TestAspect
{
/**
* @Before()
*/
public function before()
{
echo "我是前置".PHP_EOL;
} /**
* @After()
*/
public function after()
{
echo "我是后置".PHP_EOL;
}
}
浏览器访问 /hi
控制台输出
____ _____ ___ ___
/ __/ _____ / _/ /_ |_ | / _ \
_\ \| |/|/ / _ \/ _/ __/ / __/_/ // /
/___/|__,__/\___/_/ \__/ /____(_)___/ SERVER INFORMATION(v2.0.9)
********************************************************************************
* HTTP | Listen: 0.0.0.0:18306, Mode: Process, Worker: 6, Task worker: 12
******************************************************************************** HTTP Server Start Success!
2020/07/18-19:18:38 [INFO] Swoft\Server\Server:startSwoole(491) Swoole\Runtime::enableCoroutine
2020/07/18-19:18:38 [INFO] Swoft\Listener\BeforeStartListener:handle(27) Server extra info: pidFile @runtime/swoft.pid
2020/07/18-19:18:38 [INFO] Swoft\Listener\BeforeStartListener:handle(28) Registered swoole events:
start, shutdown, managerStart, managerStop, workerStart, workerStop, workerError, request, task, finish
Server start success (Master PID: 16060, Manager PID: 16065)
我是前置
我是后置
访问hello 控制台不会触发 不会打印
如果改为
/**
* @Aspect()
* @PointExecution(include={"App\Http\Controller\HomeController::h.*"})
*/
就会触发了
通过使用连接点 joinpoint可以拿到执行方法的参数 返回值等 可以放到前置 做鉴权 后置 做日志
<?php namespace App\Aspect;
use Swoft\Aop\Annotation\Mapping\After;
use Swoft\Aop\Annotation\Mapping\AfterReturning;
use Swoft\Aop\Annotation\Mapping\Aspect;
use Swoft\Aop\Annotation\Mapping\Before;
use Swoft\Aop\Annotation\Mapping\PointExecution;
use Swoft\Aop\Point\JoinPoint;
use Swoft\Http\Message\Request; /**
* @Aspect()
* @PointExecution(include={"App\Http\Controller\HomeController::h.*"})
*/
class TestAspect
{
/**
* @Before()
* @param JoinPoint $joinPoint
*/
public function before(JoinPoint $joinPoint)
{
echo "我是前置".PHP_EOL;
/** @var Request $request */
$request = $joinPoint->getArgs()[0];
$params = $request->getQueryParams(); //可以用来做鉴权
var_dump($params);
} /**
* @After()
*/
public function after()
{
echo "我是后置".PHP_EOL;
} /**
* @AfterReturning()
* @param JoinPoint $joinPoint
* @param $request Request
*/
public function afterrunning(JoinPoint $joinPoint) // 可以日志记录
{ echo "程序执行完了".PHP_EOL;
// /** @var Request $request */
// $request = $joinPoint->getArgs()[0];
// $params = $request->getBody();
// var_dump($params); return $joinPoint->getReturn();
}
}
访问浏览器 结果如下
HTTP Server Start Success!
2020/07/18-19:42:54 [INFO] Swoft\Server\Server:startSwoole(491) Swoole\Runtime::enableCoroutine
2020/07/18-19:42:54 [INFO] Swoft\Listener\BeforeStartListener:handle(27) Server extra info: pidFile @runtime/swoft.pid
2020/07/18-19:42:54 [INFO] Swoft\Listener\BeforeStartListener:handle(28) Registered swoole events:
start, shutdown, managerStart, managerStop, workerStart, workerStop, workerError, request, task, finish
Server start success (Master PID: 16459, Manager PID: 16464)
我是前置
array(1) {
["id"]=>
string(1) "4"
}
我是后置
程序执行完了
swoft 切面AOP尝试的更多相关文章
- Puzzle 面向服务/切面(AOP/IOC)开发框架 For .Net
Puzzle 面向服务/切面AOP开发框架 For .Net AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效 ...
- Liferay7 BPM门户开发之36: 使用Portlet filters过滤器做切面AOP
使用Portlet filters过滤器做切面AOP Portlet Filters定义于JSR286 Java Portlet Specification 2.0 Portlet Filters是为 ...
- Spring框架系列(五)--面向切面AOP
背景: 当需要为多个不具有继承关系的对象引入一个公共行为,例如日志.权限验证.事务等功能时,如果使用OOP,需要为每个对象引入这些公共 行为.会产生大量重复代码,并且不利用维护.AOP就是为了解决这个 ...
- Spring基础(二)_面向切面(AOP)
面向切面编程 面向切面编程[AOP,Aspect Oriented Programming]:通过预编译方式和运行期间动态代理实现程序功能的统一维护的技术.AOP 是 Spring 框架中的一个重要内 ...
- SpringBoot切面Aop的demo简单讲解
前言 本篇文章主要介绍的是SpringBoot切面Aop的demo简单讲解. SpringBoot Aop 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 切面(Aop) 一.概 ...
- 在IDEA 、springboot中使用切面aop实现日志信息的记录到数据库
文章目录 1.导入相关的依赖 2.创建要保存的数据信息实体类 3 .编写对应的sql语句 4.使用spring 的 aop 技术切到自定义注解上,所以先创建一个自定义注解类 5. 创建aop切面实现类 ...
- Java 面向切面 AOP
参考: :http://www.blogjava.net/supercrsky/articles/174368.html AOP: Aspect Oriented Programming 即面向切面编 ...
- Spring框架使用(控制反转,依赖注入,面向切面AOP)
参见:http://blog.csdn.net/fei641327936/article/details/52015121 Mybatis: 实现IOC的轻量级的一个Bean的容器 Inversion ...
- Spring 在XML中声明切面/AOP
在Spring的AOP配置命名空间中,我们能够找到声明式切面选择.看以下: <aop:config> <!-- AOP定义開始 --> <aop:pointcut/> ...
随机推荐
- [业界方案]用Jaeger来学习分布式追踪系统Opentracing
[业界方案]用Jaeger来学习分布式追踪系统Opentracing 目录 [业界方案]用Jaeger来学习分布式追踪系统Opentracing 0x00 摘要 0x01 缘由 & 问题 1. ...
- 【原创】Linux虚拟化KVM-Qemu分析(三)之KVM源码(1)
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: KVM版本:5.9 ...
- 编程体系结构(03):Java集合容器
本文源码:GitHub·点这里 || GitEE·点这里 一.集合容器简介 集合容器是Java开发中最基础API模块,通常用来存储运行时动态创建的元素,基本特点如下: 泛型特点,存储任意类型对象: 动 ...
- hystrix讲解:熔断降级隔离以及合并请求
对springcloud只是学习了基本的框架搭建,基本上看到的例子都是只使用了fallback 但是hystrix还有线程隔离和请求合并的能力 顺便吐槽 大部分人的博客例子估计都是听课的 应用 ...
- 6.Exchanger-交换机
- linux学习(五)Linux 文件与目录管理
一.Linux处理目录的常用命令 ls : 列出目录 cd :切换目录 pwd :显示目前的目录 mkdir :创建一个新的目录 rmdir :删除一个空的目录 cp : 复制文件或目录 rm : 移 ...
- Flutter音频播放--chewie_player的基本使用
发现网络似乎没有关于简单音频播放的插件介绍,这几天找了一下,结果也都不尽人意,最后也是debug一下chewie_player插件的官方demo 先上官方demo图 官方git地址:https://g ...
- 吴恩达Machine Learning学习笔记(二)--多变量线性回归
回归任务 多变量线性回归 公式 h为假设,theta为模型参数(代表了特征的权重),x为特征的值 参数更新 梯度下降算法 影响梯度下降算法的因素 (1)加速梯度下降:通过让每一个输入值大致在相同的范围 ...
- 使用 mysqld_safe 启动 mysqld 服务
目录 mysqld_safe 介绍 启动 停止 mysqld_safe 介绍 mysqld_safe is the recommended way to start a mysqld server o ...
- vue 游戏手柄使用
直接上代码. <template> <div class="home"> </div> </template> <script ...