引言:
  软件开发的目标是要对世界的部分元素或者信息流建立模型,实现软件系统的工程需要将系统分解成可以创建和管理的模块。于是出现了以系统模块化特性的面向对象程序设计技术。模块化的面向对象编程极度地提高了软件系统的可读性、复用性和可扩展性。向对象方法的焦点在于选择对象作为模块的主要单元,并将对象与系统的所有行为联系起来。对象成为问题领域和计算过程的主要元素。但面向对象技术并没有从本质上解决软件系统的可复用性。创建软件系统时,现实问题中存在着许多横切关注点,比如安全性检查、日志记录、性能监控,异常处理等,它们的实现代码和其他业务逻辑代码混杂在一起,并散落在软件不同地方(直接把处理这些操作的代码加入到每个模块中),这无疑破坏了OOP的"单一职责"原则,模块的可重用性会大大降低,这使得软件系统的可维护性和复用性受到极大限制。这时候传统的OOP设计往往采取的策略是加入相应的代理(Proxy)层来完成系统的功能要求,但这样的处理明显使系统整体增加了一个层次的划分,复杂性也随之增加,从而给人过于厚重的感觉。由此产生了面向方面编程(AOP)技术。这种编程模式抽取出散落在软件系统各处的横切关注点代码,并模块化,归整到一起,这样进一步提高软件的可维护性、复用性和可扩展性。

AOP简介:
AOP: Aspect Oriented Programming 面向切面编程。
  面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
  AOP是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面(方面)编程。
  主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。
  主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
  可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。
假设把应用程序想成一个立体结构的话,OOP的利刃是纵向切入系统,把系统划分为很多个模块(如:用户模块,文章模块等等),而AOP的利刃是横向切入系统,提取各个模块可能都要重复操作的部分(如:权限检查,日志记录等等)。由此可见,AOP是OOP的一个有效补充。
注意:AOP不是一种技术,实际上是编程思想。凡是符合AOP思想的技术,都可以看成是AOP的实现。

AOP 的基本概念:
在面向对象编程中,类,对象,封装,继承,多态等概念是描述面向对象思想主要术语。与此类似,在面向方面编程中,同样存在着一些基本概念:
       联结点(JointPoint) :一个联结程序执行过程中的一个特定点。典型的联结点有:调用一个方法;方法执行这个过程本身;类初始化;对象初始化等。联结点是 AOP 的核心概念之一,它用来定义在程序的哪里通过 AOP 加入新的逻辑。
        切入点(Pointcut) :一个切入点是用来定义某一个通知该何时执行的一组联结点。通过定义切入点,我们可以精确地控制程序中什么组件接到什么通知。上面我们提到,一个典型的联结点是方法调用,而一个典型的切入点就是对某一个类的所在方法调用的集合。通常我们会通过组建复杂的切入点来控制通知什么时候被执行。
        通知(Advice) :在某一个特定的联结点处运行的代码称为“通知”。通知有很多种,比如
在联结点之前执行的前置通知(before advice)和在联结点之后执行的后置通知(after advice) 。
       方面(Aspect) :通知和切入点的组合叫做方面,所以,方面定义了一段程序中应该包括的逻辑,以及何时应该执行该逻辑。
       织入(Weaving) :织入是将方面真正加入程序代码的过程。对于静态 AOP 方案而言,织入是在编译时完成的,通常是在编译过程中增加一个步骤。类似的,动态 AOP 方案则是在程序运行是动态织入的。
       目标(Target) :如果一个对象的执行过程受到某一个 AOP 的修改,那么它就叫一个目标对象。目标对象通常也称为被通知对象。
       引入(Introduction) :   通过引入,可以在一个对象中加入新的方法或属性,以改变它的结构,这样即使该对象的类没有实现某一个接口,也可以修改它,使之成为该接口的一个实现。

静态和动态:静态 AOP 和动态 AOP 两者之间的区别主要在于什么时间织入,以及如何织入。最早的 AOP 实现大多都是静态的。在静态 AOP 中,织入是编译过程的一个步骤。用Java 的术语说,静态 AOP 通过直接对字节码进行操作,包括修改代码和扩展类,来完成织入过程。显然,这种办法生成的程序性能很好,因为最后的结果就是普通的 Java 字节码,在运行时不再需要特别的技巧来确定什么时候应该执行通知。这种方法的缺点是,如果想对方面做什么修改,即使只是加入一个新的联结点,都必须重新编译整个程序。AspectJ 是静态 AOP 的一个典型例子。与静态 AOP 不同,动态 AOP 中织入是在运行时动态完成的。织入具体是如何完成的,各个实现有所不同。Spring AOP 采取的方法是建立代理,然后代理在适当的时候执行通知。动态 AOP 的一个弱点就在于,其性能一般不如静态 AOP。而动态AOP 的主要优点在于可以随时修改程序的所有方面,而不需重新编译目标。

AOP实践:
YII2框架本身拥有一个功能,叫做行为.它可以动态的为当前的类附加额外的功能,但这种功能在代码层级结构是静态的,有侵入性的。

下面以YII2框架集成go!aop库为例,介绍在YII2中如何实现AOP编程.(go!aop简介,可以参考go!aop的官网.)

由于YII框架拥有自己的类加载器,所在集成go!aop的时候,不能正常的工作,所以要将其禁用掉,使用composer提供的类加载器。
如下代码所示(这里使用YII2高级应用模板):

1、找到  spl_autoload_register(['Yii', 'autoload'], true, true);  (PROJECT_PATH/vendor/yiisoft/yii2/Yii.php) 将其禁用掉.

2、执行  composer require goaop/framework

3、修改composer.json文件,加入如下代码段:

 "autoload": {"psr-4": {"backend\\": "backend//","frontend\\": "frontend//","common\\": "common//"}}

4、 在frontend 目录下创建一个components是目录,并新建一个类AopAspectKernel,例如:

namespace frontend\components;
use frontend\aspects\MonitorAspect;
use Go\Core\AspectContainer;
use Go\Core\AspectKernel;
class AopAspectKernel extends AspectKernel
{protected function configureAop(AspectContainer $container){$container->registerAspect(new MonitorAspect());}
}

5、在forntend目录下在新建一个类InitAopComponent,并使其实现BootstrapInterface,使其可以在YII2框架引导时被自动引导

namespace frontend\components;
use yii\base\BootstrapInterface;
class InitAopComponent implements BootstrapInterface
{public function bootstrap($app){print_r(\Yii::$app->params['aop']);$applicationAspectKernel = AopAspectKernel::getInstance();$applicationAspectKernel->init(\Yii::$app->params['aop']);}
}

6、在frontend/config/params.php中新增如下代码:

 'aop' => ['debug' => true,'appDir' => dirname(__DIR__),'cacheDir' => dirname(__DIR__) . '/runtime/aop','includePaths' => [dirname(__DIR__)]]

7、在frontend下面新建aspects目录,并新建类MonitorAspect,代码如下:

namespace frontend\aspects;use Go\Aop\Aspect;
use Go\Aop\Intercept\MethodInvocation;
use Go\Lang\Annotation\Before;
class MonitorAspect implements Aspect
{/*** Method that will be called before real method** @param MethodInvocation $invocation Invocation* @Before("execution(public frontend\components\AopTestComponent->*(*))")*/public function beforeMethodExecution(MethodInvocation $invocation){$obj = $invocation->getThis();echo 'Calling Before Interceptor for method: ',is_object($obj) ? get_class($obj) : $obj,$invocation->getMethod()->isStatic() ? '::' : '->',$invocation->getMethod()->getName(),'()',' with arguments: ',json_encode($invocation->getArguments()),"<br>\n";}
}

9、修改frontend/config/main.php文件,并在components数组下新增一个key,代码如下:

 'components'=>['aop' => ['class' => 'frontend\components\InitAopComponent']]

10、修改frontend/config/main.php文件,并在bootstrap数组下新增aop值,代码如下:

'bootstrap'=>['log','aop']

至此,YII2整合go!aop完成...

转载于:https://www.cnblogs.com/cmacro/p/9327602.html

YII2集成GOAOP,实现面向方面编程!相关推荐

  1. 程序员,技术的“背锅侠”,盘点 2020 年面向监狱编程的那些事!

    [CSDN 编者按]过去一年,"删库跑路".安全漏洞等事件层出不穷,企业.技术人深受其害,作为一名程序员,在新的一年即将到来之际,我们该如何避免面向监狱编程? 作者 | 马超    ...

  2. Java面向接口编程,低耦合高内聚的设计哲学

    接口体现的是一种规范和实现分离的设计哲学,充分利用接口可以极大的降低程序中各个模块之间的耦合,提高系统的可维护性以及可扩展性. 因此,很多的软件架构设计理念都倡导"面向接口编程"而 ...

  3. SpringBoot面向切面编程-用AOP方式管理日志

    面向切面编程 认识AOP AOP(Aspect Oriented Program,面向切面编程)把业务功能分为核心.非核心两部分. 核心业务功能 非核心业务功能 用户登录,增加数据,删除数据 性能统计 ...

  4. Spring(4)——面向切面编程(AOP模块)

    Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用. AOP 即 Aspect Orien ...

  5. AOP(面向切面编程)大概了解一下

    前言 上一篇在聊MemoryCache的时候,用到了Autofac提供的拦截器进行面向切面编程,很明显能体会到其优势,既然涉及到了,那就趁热打铁,一起来探探面向切面编程. 正文 1. 概述 在软件业, ...

  6. 面向切面编程AspectJ在Android埋点的实践

    在项目开发中,对 App 客户端重构后,发现用于统计用户行为的友盟统计代码和用户行为日志记录代码分散在各业务模块中,比如在某个模块,要想实现对用户的行为一和行为二进行统计,因此按照OOP面向对象编程思 ...

  7. 面向需求编程才是常态,聊聊我的经历

    这篇文章中的内容在几年前曾经发过,之所以今天整理一下再发一次,是因为最近不少有人问我类似的问题: 工作无聊,主要是增删改查. 现有项目很烂,在上面修修补补 没有从事过高并发,大流量的项目,简历没有亮点 ...

  8. 程序员避免面向监狱编程攻略大盘点

    2020年时间过得好快,转眼间白驹过隙般飞奔而去,而在岁末年初的当口,笔者在回顾这一年程序员世界的大事件后,突然发觉如何避免程序员面向监狱编程是个特别值得一谈的话题,这几天一款秒杀茅台酒的Python ...

  9. AOP—面向切面编程

    前言 上一篇在聊MemoryCache的时候,用到了Autofac提供的拦截器进行面向切面编程,很明显能体会到其优势,既然涉及到了,那就趁热打铁,一起来探探面向切面编程. 正文 概述 在软件业,AOP ...

最新文章

  1. JAVA方法中的参数用final来修饰的效果
  2. One Day-XML:XSLT
  3. 2021牛气新年素材模板,你真的不来看一看吗?
  4. dcm4chee汉化_docker dcm4chee
  5. 湖北省小学生计算机大赛,湖北省中小学电脑制作活动机器人竞赛类暨创客竞赛类项目选拔赛在我校举行...
  6. H264、H265编码概念及I帧P帧B帧
  7. Hspice中的测量语句(II)
  8. 煤炭及煤化工加工会产生什么危废_煤化工固体废物的清洁处置
  9. 四分位数计算方法总结
  10. MongoDB修改器使用
  11. 中国科学家或揭开生物第六感之谜
  12. 【转】机器学习embedding
  13. 程序员的自我修养--链接、装载与库笔记:第一章温故而知新
  14. colormap保存 matlab_matlab的colormap的保存
  15. Mac 系统打开 word 显示全黑怎么处理
  16. IDEA 断点:断点失效问题
  17. 使用Javascript制作声音按钮
  18. Python爬虫之爬取笔趣阁小说下载到本地文件并且存储到数据库
  19. DIY搭建黑群晖(XPEnology)备忘记载
  20. java tea属于红茶吗_乌龙茶属于红茶吗?

热门文章

  1. android通讯录管理(获取联系人,通话记录,短信消息),Android通讯录管理(获取联系人、通话记录、短信消息)(二)...
  2. Django框架基础知识点
  3. flask双向映射语法
  4. 关于jboss在jdk6下webservice不正常问题的解决
  5. 自己写的TimeHelper javal时间工具
  6. 最新数据分析与商业智能趋势前瞻
  7. js php 正则差别,JavaScript正则表达式的浏览器的差异
  8. python中的if not语句_python中使用if not x 语句用法
  9. Javasc中发出HTTP请求最常用的方法
  10. 将一个数字划分成树状