标签:系统 最大 方式 return 接下来 类装载 其他 ice bubuko
考虑这样一个问题:需要对系统中的某些业务做日志记录,比如支付系统中的支付业务需要记录支付相关日志,对 于支付系统可能相当复杂,比如可能有自己的支付系统,也可能引入第三方支付平台,面对这样的支付系统该如何解决 呢?
1. 传统解决方案
1)日志部分提前公共类LogUtils,定义“longPayBegin”方法用于记录支付开始日志,“logPayEnd”用于 记录支付结果:
2)支付部分,定义IPayService接口并定义支付方法“pay”,并定义了两个实现:“PointPayService”表示 积分支付,“RMBPayService”表示人民币支付;并且在每个支付实现中支付逻辑和记录日志:
3)支付实现很明显有重复代码,这个重复很明显可以使用模板设计模式消除重复:
4)到此我们设计了一个可以复用的接口;但大家觉得这样记录日志会很好吗,有没有更好的解决方案?
如果对积分支付方式添加统计功能,比如在支付时记录下用户总积分数、当前消费的积分数,那我们该如何做呢?直接 修改源代码添加日志记录,这完全违背了面向对象最重要的原则之一:开闭原则(对扩展开放,对修改关闭)?
2. 更好的解决方案
在我们的支付组件中由于使用了日志组件,即日志模块横切于支付组件,在传统程序设计中很难将日志组件分离出来,即
不耦合我们的支付组件;因此面向方面编程AOP就诞生了,它能分离我们的组件,使组件完全不耦合:
1)采用面向方面编程后,我们的支付组件看起来如下所示,代码中不再有日志组件的任何东西;
2)所有日志相关的提取到一个切面中,AOP实现者会在合适的时候将日志功能织入到我们的支付组件中去,从而完全 解耦支付组件和日志组件。
面向方面编程(AOP):也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对 象编程(OOP)。
在进行OOP开发时,都是基于对组件(比如类)进行开发,然后对组件进行组合,OOP最大问题就是无法解耦组 件进行开发,比如我们上边举例,而AOP就是为了克服这个问题而出现的,它来进行这种耦合的分离。
AOP为开发者提供一种进行横切关注点(比如日志关注点横切了支付关注点)分离并织入的机制,把横切关注点分 离,然后通过某种技术织入到系统中,从而无耦合的完成了我们的功能。
AOP主要用于横切关注点分离和织入,因此需要理解横切关注点和织入:
1. 传统支付流程
2. AOP
面向切面方式,先将横切关注点分离,再将横切关注点织入到支付系统中:
AOP能干什么:
? 用于横切关注点的分离和织入横切关注点到系统;比如上边提到的日志等等;
? 完善OOP;
? 降低组件和模块之间的耦合性;
? 使系统容易扩展;
? 而且由于关注点分离从而可以获得组件的更好复用。
在进行AOP开发前,先熟悉几个概念:
在AOP中,通过切入点选择目标对象的连接点,然后在目标对象的相应连接点处织入通知,而切入点和通知就是切面 (横切关注点),而在目标对象连接点处应用切面的实现方式是通过AOP代理对象
接下来再让我们具体看看Spring有哪些通知类型:
AOP代理就是AOP框架通过代理模式创建的对象,Spring使用JDK动态代理或CGLIB代理来实现,Spring缺省使用 JDK动态代理来实现,从而任何接口都可别代理,如果被代理的对象实现不是接口将默认使用CGLIB代理,不过CGLIB 代理当然也可应用到接口。
AOP代理的目的就是将切面织入到目标对象。
参考文献:
https://jinnianshilongnian.iteye.com/blog/1418596
标签:系统 最大 方式 return 接下来 类装载 其他 ice bubuko
原文地址:https://www.cnblogs.com/Hermioner/p/10200753.html