AOP概述
- Aspect Orieted Programming ,中文叫“面向切面编程”或“面向方面编程”
- 是一种编程模式,将分布在多个类中的功能封装到一个类中,这些功能称为cross-cutting concerns(横切关注点),如日志、事务、缓存权限、安全等
- 不是替代OOP,而是对其的补充
-
上面这张图看起来,好像挺复杂。如果从横线的角度来看的话,这里有若干个软件核心的业务模块。假如将上图当成是一个电商系统,三个竖方向是处理商品的、处理订单的、处理用户的三个模块。这些模块中都有相同的功能,比如对权限的管理、对日志的记录、事务的控制。
-
它们是分布在各个业务之间,可能都是一些相同的处理逻辑,那么这种情况感觉使用面向对象的方式也可以解决,但是从设计的角度来说,这种模块和业务模块之间是没有关系的。比如业务模块不应该跟权限模块密切相关,如果使用面向对象的里面的设计,很容易想到使用继承,但是一个特定的业务模块跟权限、日志、事务这样的功能并不是继承关系。
-
如果使用AOP的方式来编程的话,情况就不一样。我们可以将三个权限、日志、事务这几个模块提取出来,在写业务模块的时候并不考虑这些横切的关注点,我们只需要实现主流的业务就可以。
-
我们通过某种方式,将横切关注点加到核心业务模块的执行过程里面,这种方式实际上就是AOP的编程模式。
AOP的优点
-
减少了大量的代码重复
从上图来看,一个业务模块里面都有类似的功能,比如权限判断的代码很多都是类似的,再比如跟数据库打交道控制事务的代码也是非常的重复,通过面向切面编程,我们并不需要重复的编写这些逻辑,我们单独把它们提取到一个类中就可以了,这样对于维护上来说也是相当方便的。 -
功能组件之间的解耦
假如将上图的横切关注点封装成一个类,里面提供若干的方法,在每个模块里面需要用的话,直接使用方法调用,那么这样也还会有耦合。
如果使用AOP的话,可以将核心业务模块的功能和横切关注点的功能完全分开,这样在代码层面是毫无关联的。并且解耦后,程序的灵活性也能得到极大的提升。
AOP的框架
- AspectJ
功能非常强大,已经发展成为业界的标准,包括Spring也会支持AspectJ。
AspectJ伴随着功能强大,使用上也会比较复杂点,因为它提供了一种非Java的语法来编写代码。如果要掌握AspectJ,还要学习它的一些基本语法。 - Spring
学习起来比AspectJ比较简单一些,而且它编程风格和Java是完全一致的。绝大部分使用Spring的AOP功能,就能够很好的满足我们的需求。 - Aspectwerkz
用起来也比较简单 - JBoss AOP
是JBoss提供的
AOP的类型
- 静态AOP
- 修改应用程序的字节码,必要时会改变与扩展应用程序代码
- 性能好,但是改动了切面需要重新编译整个应用程序
- AspectJ提供了实现
- 动态AOP
- 实现过程是在运行时动态执行
- 性能稍差,但是改动了切面无需重新编译整个应用程序
- Spring使用代理机制实现