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/> ...
随机推荐
- 掌控安全less6 靶场简易--盲注
1.判断是否存在sql注入 http://injectx1.lab.aqlab.cn:81/Pass-11/index.php?id=1" and "1"=" ...
- Magento中数据拷贝一实现
Mage_Sales_Model_Quote::setCustomer方法,有这么一行代码 Mage::helper('core')->copyFieldset('customer_accoun ...
- nginx异步访问mysql
nginx中有一个模块有这个功能,(以前的文章中扩展,这里叫模块,以后统一叫模块,模块可能准确点,因为扩展是单独的文件,而模块是嵌入到主文件中的),这个模块叫drizzle-nginx-module, ...
- hystrix文档翻译之运维
hystrix不仅用作工程可靠性还可以用来运维. 这里将会分享一个拥有100+Hystrix命令,40+线程池,每天有100亿次线程请求,2000亿次信号量请求的系统是如何使用hystrix运维的.这 ...
- 实验 3:Mininet 实验——测量路径的损耗率
实验目的 在实验 2 的基础上进一步熟悉 Mininet 自定义拓扑脚本,以及与损耗率相关的设 定:初步了解 Mininet 安装时自带的 POX 控制器脚本编写,测试路径损耗率. 实验任务 h0 向 ...
- 【性能监控-Perfmon工具】手动添加数据收集器,点击保存时需要输入用户NT AUTHORITY\SYSTEM的密码问题
发现是有的电脑会弹出这种输入用户NT AUTHORITY\SYSTEM密码的现象,有的电脑不会弹出这个对话框.......仍然没搞懂是为什么? 关键是输入windows用户登录时的密码也不对!!压根不 ...
- java进阶(23)--List接口
一.基本概念 1.有序可重复 2.有下标 3.包含ArraList.LinkedList.Vector 二.List中特有的方法 且常用 (以下军均为数组通用方法) 1.void add(int ...
- 2020 Java开发者数据分析:中国已成为 Java 第一大国
最近知名开发工具供应商Jetbrains在Java 25周年之际,对开发群体做了一次有意思的数据分析. 全文内容可见:https://blog.jetbrains.com/idea/2020/09/a ...
- Python-变量、变量作用域、垃圾回收机制原理-global nonlocal
变量实现原理决定了Python使用的垃圾回收机制为变量引用计数,当这个对象引用计数为0时候,则会自动执行__del__函数回收资源, del方法只是把变量指向的对象引用计数减一而已并删除这个变量 表达 ...
- unity inspector 自动装载Commont和Prefab属性
在使用unity的过程中,经常遇到这样的问题:每次都需要手动为序列化属性拖拽赋值.像这样: 试着找了找,真的找到了一份代码,但是缺少自动装载Prefab的功能.之后我花了点时间添加这个功能. 使用方法 ...