为什么会有AOP
在软件开发中,概念上应该与业务逻辑进行分离,却往往与业务逻辑混合在一起,例如AOP经典例子,日志,权限等等。这些应用于程序多处的功能点,称为横切关注点(cross-cutting concern)
。为了把这些横切关注点与业务逻辑进行分离,就是AOP要解决的问题。AOP适合那些具有横切逻辑的应用场合,AOP为继承体系进行无法进行抽象的重复性代码提供了解决方案。
AOP概念
一个系统由多个模块组成,提供一个个特定的功能,但是这些功能都需要一些辅助功能,例如日志,安全等。这些与模块概念上应该保持独立。功能的重用可以通过继承或者委托进行,委托在java中通过代理进行实现。
- 通知,增强(Advice)
切面功能,切面需要完成的工作。定义了切面是什么功能,需要什么时候执行这个工作。
前置通知,后置通知,返回通知,异常通知,环绕通知 - 连接点(Join Point)
应用程序执行过程中,能够插入切面的点。切面利用连接点进入程序正常流程,并可以添加新的功能。Spring仅支持方法级别的连接点,方法执行前,后,环绕,抛出异常时。 - 切点(Pointcut) WHERE
切点是连接点的子集,定义了切面在何处进入程序的正常流程。一个切点可以对应一系列的连接点。 - 目标对象(Target)
AOP需要操作的对象,需要添加功能的对象类。 - 引介(Introduction)
一种特殊的Advice,为Target添加新的属性和方法。例如实现新的结构,添加新的属性,动态的为该业务类添加接口。 - 织入(Weaving)
将Advice增加到具体的链接点的过程。- 编译器织入
- 类装载期织入
- 动态代理期织入
- 代理(Proxy)
一个类被织入后产生的结果类。他是融合了Target和Advice的生成的结果类。 - 切面(Aspect)
横切关注点被模块化为一个特殊的类,它就是切面。切面是由切点与通知组成,前者确定切面何处
,同住确定切面何时,做什么
。
有两个好处:- 讲分散在系统中的同一个功能点进行统一的管理。
- 模块内仅仅关注自己的核心业务逻辑,次要的关注点移到了切面中。
例子
在一个餐厅,我去点了一份番茄炒蛋,如果是小餐厅,那么主要一个厨师,他要先洗菜,做菜,出锅。如果这是一个超大的餐厅,有很多的厨师,就像我们系统的各个模块,那么如果每个厨师都自己洗菜,就像我们散落在系统中的各个功能点,厨师的工资可是很贵的,不能浪费在洗菜这些和他主要职责相关但是完全可以找一个专业洗菜的,工钱节省,厨师也开心。这里洗菜小工就是一个通知,他需要在厨师做菜之前把菜洗好,这里的切点是厨师做菜(何处),做菜前(何时),洗好菜(做什么)。连接点就有很多了,比如我下单,上菜,做菜都是连接点。