如何理解AOP面向切面编程
开始
今天和大家聊聊AOP:面向切面编程思想。开始聊之前,先和大家一起从编程思想的发展说起。
编程思想的发展历程:
1、POP编程
首先,大家应该都知道,什么是POP编程吧,就是面向过程编程。关于这个编程思想就不做介绍了。
从思维上来讲,面向过程更强调细节,忽视了整体性和边界性。
典型代表是 C/C++的结构体。
POP的不足:
代码重用性低,不易扩展,维护起来难度大,耦合度比较高。
2、OOP编程
面向对象编程,把事物对象化,对象包含属性和方法,万物皆对象。
当规模不大,面向过程编程就可以了
最终实现业务,还是得面向过程,按照过程,把业务串起来。
OOP的形式:一个模块由多个类组成,模块又组成某个服务,多个服务组成一个系统
业务变更,需要修改代码,类肯定要发生改变
但是类应该是固定的,不应该频繁被修改,甚至是不允许修改
从而引出了设计模式,就是为了解决这个问题。
OOP的思想,对象组织,是以继承关系为主线,纵向的,有底到高。
OOP问题:
1)、共性问题,纵向思维,共性越多,接口就越多
2)、扩展问题,需要对现有的对像动态添加某种行为。
因此,由于OOP的问题,从而引出了AOP编程
3、AOP编程
所谓的AOP :面向切面编程,它是可以通过预编译的方式和运行期动态实现,在不修改源代码的情况下,给程序动态统一添加功能的技术。
OOP是关注将需求功能划分为不同的,相对独立的,封装良好的类,并让他们有自已的行为,依靠继顾,多态来定义彼此的关系。
AOP是希望能够将通用功能从不相关的类分离出来,能够使很多类,共享一个行为,这个行为,一旦发生变化,我们只需要修改这个行为就行了,而不需要去修改其他的类。
AOP的切面怎么理解呢?
橫切关注点:比如一个电商系统,处理一个订单,需要进行授权认证,订单处理,日志记录。。。更多操作;商品入库,也需要进行授权认证,入库处理,日志记录。。。更多操作。
OOP,程序都是通过类和接口组织的,核心业务逻辑采用OOP是很合理的。但对于横跨系统中多个模块的功能需求,就比较吃力了,比如日志处理,授权验证,统一的异常处理,性能统计等
而这些都有一个共同点,都是非业务的,非业务的功能代码,从业务代码中抽离出来,独立到非业务的功能代码中,这样我们改变这些行为时,就不会影响现有的业务逻辑代码
简单来说,AOP就是将通用功能抽取出来。面向切面,就是关注通用功能,而不关注业务,而我们的OOP是关注业务的,这就是它们的区别。
AOP实现原理:预先定义一组特性,使它具有拦截方法的功能,执行方法之前和之后做你想要做的事情,而这个的拦截关卡,就是所谓的切面
过滤器,其实就是AOP的一种实现
AOP的优势:
1)、将通用功能从业务逻中抽离出来,提高代码的复用性,有利于后期的维护和扩展
2)、在软件设计时,抽出通用功能(抽出切面),降低架构的复杂度,这样在做系统时,只需要完成业务处理功能
4、AOP和OOP的区别:
1)、面向的目标不同:OOP面向的是名词领域(商品、对象、类),AOP面向的是动词领域(授权、验证、监控、埋点)
2)、思想结构不同:OOP是纵向结构,AOP是横向结构。
3)、注重的方面不同:OOP注重业务逻辑单元的划分;AOP偏重业务处理过程中某个步骤或者阶段的行为。
5、AOP和OOP的关系。
AOP其实是OOP的一个补充,它们都是编程思想,是相互弥补各自的不足,就犹如,OOP弥补POP的不足。
核心需求,仍然由OOP来实现,具体的业务,由POP来实现。而AOP就是为了让OOP更专注于业务的逻辑处理,它们都是相辅相成的
6、如何在代码里去实现AOP
这里就不过多的介绍了,实现在AOP的方式有很多种,通过设计模式就可以实现。
装饰器模式:允许向一个对象添加新的功能,同时又不改变其结构。
代理模式:一个类代表别一个类,然后向外界提供功能接口。
过滤器。