1. 什么是AOP——面向切面编程
AOP是一种编程范式,提供了一种从宁一个角度来考虑程序结构以完善面向对象编程(OOP)
AOP是一个思想上的变化——主从换位,让原本主动调用的模块变成了被动等待,甚至在毫不知情的情况下被织入了很多新的功能。弥补了面向对象编程OOP的不足。
在开发中,我们考虑问题都是纵向的,也就是默认都是从上到下,上层依赖下层。拿我们最熟悉的三层架构来说,也是从上到下来考虑的,通常都是表现出调用逻辑层,逻辑层调用数据层。如下图:
慢慢的,越来越多的人发现,在各个模块之中,存在一些共性的功能,这些部分是融入的。比如下图的日志管理、安全检查、事务管理等模块。
我们从横向的角度将这些模块进行从业务代码中剥离出来,如下图
这个时候,对这些共性功能的思考就是从横向角度来思考的,与以往的面向对象的思维方式有所不同,既然有了问题,那么就需要解决方案,于是,AOP就站出来了。
AOP为开发者提供了一种描述横切关注点的机制,并能过够自动将横切关注点织入到面向对象的软件系统中,从而实现了横切关注点的模块化。
AOP将那些与业务无关,却为业务模块所公共调用的逻辑或责任,比如事务管理、日志管理等封装起来,便于减少系统重复的代码,降低模块间的耦合度,有利于未来的可维护性和可操作性。
AOP之所以强大就是因为他可以自动将横切关注点的某块自动织回到软件系统中,这是什么意思呢?
来看下图,在没有AOP的常规面向对象系统中,对这些共性的功能是如何处理的。
从图中可以看到,是从应用模块中主动调用公共模块,也就是应用模块需要很清楚公共模块的功能以及具体的调用方法才行,应用模块是依赖于公共模块的,是耦合的,这样一来,要想修改公共模块就很困难了,牵一而发百。
我们再来看看AOP是怎么处理的?
乍一看,和上面没有什么区别嘛,但是仔细看看,所有的箭头都反向了,原来是从应用模块去调用公共模块,现在是从公共模块主动织回到应用系统中(公共模块调用应用模块)。
不要小看这一点变化,这样一来,应用模块就不需要知道公共模块了,也就是应用模块和公共模块解耦了。公共模块会在合适的时候,由外部织入到应用系统中,至于谁来实现,以及怎么实现这里就不作讲解,我们更关注的是其思想。