作者微信 bishe2022

代码功能演示视频在页面下方,请先观看;如需定制开发,联系页面右侧客服
AOP 之 6.1 AOP基础 ——跟我学spring3

Custom Tab

6.1.1  AOP是什么

        考虑这样一个问题:需要对系统中的某些业务做日志记录,比如支付系统中的支付业务需要记录支付相关日志,对于支付系统可能相当复杂,比如可能有自己的支付系统,也可能引入第三方支付平台,面对这样的支付系统该如何解决呢?

              1)日志部分提前公共类LogUtils,定义“longPayBegin”方法用于记录支付开始日志,“logPayEnd”用于记录支付结果:

1.jpg

  2)支付部分,定义IPayService接口并定义支付方法“pay”,并定义了两个实现:“PointPayService”表示积分支付,“RMBPayService”表示人民币支付;并且在每个支付实现中支付逻辑和记录日志:

lllllllllllllllllllllllll.jpg

     3)支付实现很明显有重复代码,这个重复很明显可以使用模板设计模式消除重复:

wwwwwwwwwwwwwwwwww.jpg

4)到此我们设计了一个可以复用的接口;但大家觉得这样记录日志会很好吗,有没有更好的解决方案?

如果对积分支付方式添加统计功能,比如在支付时记录下用户总积分数、当前消费的积分数,那我们该如何做呢?直接修改源代码添加日志记录,这完全违背了面向对象最重要的原则之一:开闭原则(对扩展开放,对修改关闭)?

 

1)采用面向方面编程后,我们的支付组件看起来如下所示,代码中不再有日志组件的任何东西;

eeeeeeeeeeeeeeeeeee.jpg


2)所以日志相关的提取到一个切面中,AOP实现者会在合适的时候将日志功能织入到我们的支付组件中去,从而完全解耦支付组件和日志组件。

rrrrrrrrrrrrrrrrrrrrrrrrrrrrr.jpg


看到这大家可能不是很理解,没关系,先往下看。

 

面向方面编程(AOP):也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP)。

 

       在进行OOP开发时,都是基于对组件(比如类)进行开发,然后对组件进行组合,OOP最大问题就是无法解耦组件进行开发,比如我们上边举例,而AOP就是为了克服这个问题而出现的,它来进行这种耦合的分离。

       AOP为开发者提供一种进行横切关注点(比如日志关注点横切了支付关注点)分离并织入的机制,把横切关注点分离,然后通过某种技术织入到系统中,从而无耦合的完成了我们的功能。

 

6.1.2  能干什么

       AOP主要用于横切关注点分离和织入,因此需要理解横切关注点和织入:

横切关注点可能包含很多,比如非业务的:日志、事务处理、缓存、性能统计、权限控制等等这些非业务的基础功能;还可能是业务的:如某个业务组件横切于多个模块。如图6-1

cefb51a30cc92efc92d0cf70da7d64b7__6.jpg


传统支付形式,流水方式:

ddddddddddddddd.jpg

  面向切面方式,先将横切关注点分离,再将横切关注点织入到支付系统中:

bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.jpg

AOP能干什么:

 

6.1.3  AOP的基本概念

       在进行AOP开发前,先熟悉几个概念:

在AOP中,通过切入点选择目标对象的连接点,然后在目标对象的相应连接点处织入通知,而切入点和通知就是切面(横切关注点),而在目标对象连接点处应用切面的实现方式是通过AOP代理对象,如图6-2所示。

hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh.jpg

图6-2 概念关系

接下来再让我们具体看看Spring有哪些通知类型:

各种通知类型在UML序列图中的位置如图6-3所示:

b4447d0a13f6fcfd520bdbb14076c625__10.jpg

图6-3 通知类型

 

6.1.4  AOP代理

       AOP代理就是AOP框架通过代理模式创建的对象,Spring使用JDK动态代理或CGLIB代理来实现,Spring缺省使用JDK动态代理来实现,从而任何接口都可别代理,如果被代理的对象实现不是接口将默认使用CGLIB代理,不过CGLIB代理当然也可应用到接口。

 

       AOP代理的目的就是将切面织入到目标对象。

 

       概念都将完了,接下来让我们看一下AOP的 HelloWorld!吧。

http://sishuok.com/forum/blogPost/list/2466.html
















  

Home